Fermat's letzter Satzalgorithmus

7

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?

    
Francesco B. 12.06.2013, 12:22
quelle

3 Antworten

12

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.

    
Bathsheba 12.06.2013, 12:29
quelle
7
  

Vermisse ich etwas

?

Sie sind. Ziemlich viel tatsächlich. Lass mich aufzählen.

  1. Typen Nicht alle Zahlen in C ++ sind Ganzzahlen. Insbesondere ist das Ergebnis von pow keine Ganzzahl.
  2. Präzision . Diese Typen, die keine Ganzzahlen sind, haben eine begrenzte Genauigkeit in C ++. In Mathematik sind 1 und 1,00000000000000000000000000000000000000000000000000982 unterschiedliche Zahlen. In Ihrem C ++ Programm, viel Glück damit.
  3. Einschränkungen Sowohl ganzzahlige als auch nicht ganzzahlige Zahlen in C ++ sind in dem Wertebereich begrenzt, den sie annehmen können. Eine Variable vom Typ 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.
n.m. 12.06.2013 12:34
quelle
2

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.

    
Jan Krüger 12.06.2013 12:29
quelle

Tags und Links