Python Modulo Ergebnis unterscheidet sich von Wolfram Alpha?

8

Wenn ich mein Python 3-Programm starte:

%Vor%

ergibt 211 ^ (- 1).

Aber wenn ich die Berechnung in Wolfram Alpha Ich bekomme das Ergebnis, das ich erwartet habe.

Ich habe einige Testausgaben gemacht und die Variablen exp , p und q im Programm sind alle ganzzahligen Werte, die ich in Wolfram Alpha verwendet habe.

Mein Ziel ist es, einen privaten Schlüssel aus einer (schwach) verschlüsselten Ganzzahl abzuleiten. Wenn ich mein Wolfram-Alpha-Ergebnis teste, kann ich die verschlüsselte Nachricht korrekt entschlüsseln.

    
Asbestion 23.11.2015, 19:41
quelle

4 Antworten

11

Wolfram Alpha berechnet das modulare Inverse . Das heißt, dass die Ganzzahl x so gefunden wird, dass

%Vor%

Dies ist nicht dasselbe wie der Modulooperator % . Hier berechnet Python einfach den Rest, wenn 1/exp durch (p - 1)*(q - 1) geteilt wird, wenn der Ausdruck in Ihrer Frage angegeben wird.

Kopieren Sie den Python-Code aus dieser Antwort , Sie können den gewünschten Wert auch mit Python berechnen:

%Vor%     
Alex Riley 23.11.2015, 19:52
quelle
5

Wolfram Alpha hat keine gut definierte Syntax. Es nimmt beliebigen Text, den Sie zur Verfügung stellen, und versucht herauszufinden, was Sie mit dieser Eingabe meinen. In diesem Fall entschied es, dass Sie wahrscheinlich nach einer modularen Umkehrung suchten, und es gab Ihnen eine.

Python hat eine wohldefinierte Syntax. In Python nimmt der Parser die ** und % nicht zusammen und rät, dass diese Kombination den beiden Operatoren eine andere Bedeutung als ihre übliche Bedeutung verleiht. Der ** wird wie üblich berechnet, und dann ist % der Modulo-Operator. Wenn Sie eine modulare Inverse möchten, müssen Sie eine selbst schreiben.

    
user2357112 23.11.2015 19:54
quelle
1

Ich denke, die Idee hier ist, dass Wolfram Alpha und Python die Modulo-Operation anders definieren, je nachdem, ob es sich um Ganzzahlen oder reelle Zahlen handelt. In diesem Fall verwendet Wolfram Alpha die Modulo-Invertierung, da es erkennt, dass die erste Zahl 0 & lt; x & lt; 1

Weitere Informationen zur Definition von reellen Zahlen hier

    
nichochar 23.11.2015 19:53
quelle
0

Python wertet sofort aus (211 ^ (- 1) wird berechnet als 0,004739 ... und nicht ekpt als 1/211) und der modulare euklidische Rest für x und y ist konventionell als x-floor(x/y)*y definiert, wenn eines von x , y eine rationale Zahl ist. Wenn Sie Ihre Berechnung mit einem dedizierten zahlentheoretischen Programm wie z.Bsp .: GP / Pari

machen %Vor%

Sie erhalten das Ergebnis, das Sie erwartet haben, weil a) es Bruchteile so lange Brüche wie möglich hält und b) über modulare Arithmetik verfügt.

Sind Sie wie Python, können Sie sich die Programme anschauen, die auf SciPy angeboten werden. SymPy könnte das sein, wonach Sie suchen.

    
deamentiaemundi 24.11.2015 00:14
quelle