Ich nehme diese Definition von Fermat's Theorem.
Ich habe versucht, einen Algorithmus zu schreiben, um ihn für kleine Werte zu validieren:
%Vor%Und das ist ein Bildschirm einer Ausgabe:
Wie ist es möglich? Fehle ich etwas über "große Ganzzahlen" in C ++ - Programmierung, die ein falsches Ergebnis erhalten können?
Ihre pow () Funktionen sind überfüllt; Erinnern Sie sich, dass int
eine begrenzte Größe hat.
Zum Beispiel wird pow (256, 4) bei 32 Bit, pow (256, 8) bei 64 Bit überlaufen, auch wenn Sie unsignierte Datentypen verwenden.
Technisch int
overflow ist undefiniertes Verhalten , also alles kann passieren, einschließlich Wrap around (dh zurück auf 0) oder nasal dämonen .
unsigned int
Berechnungen sind modulo 2 erhöht auf die Stärke von WIDTH gemäß dem Standard; d. h. wird immer umhergehen.
Vermisse ich etwas
?
Sie sind. Ziemlich viel tatsächlich. Lass mich aufzählen.
pow
keine Ganzzahl. int
kann garantiert Zahlen zwischen -32767 bis einschließlich 32767 enthalten. Viele Implementierungen unterstützen tatsächlich ein ganzes Stück mehr als das, sagen wir -2147483648 bis 2147483647. Viele Implementierungen haben andere Typen, die größere Zahlenbereiche enthalten können, z. 0 bis 18446744073709551616 oder manchmal bis 340282366920938463463374607431768211456 oder sogar bis 115792089237316195423570985008687907853269984665640564039457584007913129639936. (Wenn Sie Logarithmen von 100-stelligen Zahlen in Ihrem Kopf nehmen können, werden Sie feststellen, dass alle diese Grenzen Potenzen von 2 oder etwas in der Nähe sind). Zum Vergleich: 927 an die Macht der 104 376957467458457979751155893254582133603833255821602148851832991547421266649046326838345134050350882042675908426098865621401193999321757163912667101283653576225503152314408933435079267041822928198211089834145222519701307017745008621307049171220994632585789166175212394809510781938945415209193278956111609706241. int
-Werte sind auf 32 Bit begrenzt (einschließlich des Vorzeichen-Bits), so dass hohe Werte über 2147483647 hinausgehen. C / C ++ haben keinen eingebauten Datentyp für beliebig große Werte.
Um das Problem etwas zu reduzieren, können Sie den Typ long
oder unsigned long
(64 Bit auf 64-Bit-Plattformen) verwenden. Einige Compiler unterstützen 64 Bit auch auf 32-Bit-Plattformen, wenn Sie long long
verwenden.
Bearbeiten: Wie in einem Kommentar unten erwähnt, gelten die Grenzen nicht für alle Implementierungen von C / C ++, aber für die meisten nicht eingebetteten Systeme, die Sie heute sehen werden, sind das die Grenzen, die Sie erreichen werden sehen.