Frage

Ich versuche, ein erstes Lisp Programm zur Arbeit zu kommen, die CLISP Implementierung verwenden, indem Sie

(print (mod (+ (* 28433 (expt 2 7830457) 1)) (expt 10 10))))

in der REPL.

aber es gibt mir *** - overflow during multiplication of large numbers. Ich dachte, Lisp Funktionen beliebiger Größe / Präzision. wie kann das jemals dann passieren?

War es hilfreich?

Lösung

Nach http://clisp.cons.org/impnotes/num-concepts .html die maximale Größe für eine bignum ist (2 ^ 2097088-1) und Ihr 2 ^ 7830457 ist viel größer als das.

Vielleicht Sie brechen diese Zahl aussehen können - vielleicht trennt eine Reihe von kleineren 2 ^ X Faktoren ...

Andere Tipps

Lisp des bignums kann wirklich große Zahlen halten, aber auch sie haben ihre Grenzen haben.

In Ihrem Fall können Sie Potenzierung und Modul in ein einziges Verfahren kombinieren, z.B. wie in http://en.wikipedia.org/wiki/Modular_exponentiation#Right- to-left_binary_method .

Die Chancen stehen gut, es gibt einen besseren Weg, um das Problem zu lösen. Ich habe es nicht geschafft, die weit auf PE, aber ich kenne die wenigen, die ich bisher gemacht habe neigen zu haben „Aha!“ Lösungen für Probleme, die von einem Computerprogramm scheinen aus reichen.

Dieses besonders - 2 ^ 7830457 ist ein große Zahl - try (format t "~r" (expt 2 160)). Sie könnten versuchen, das Problem in einem neuen Licht zu schauen und sehen, ob es ein Weg zu Blick darauf, dass Sie nicht gedacht haben.

Lisp ist eine Familie von Sprachen mit Dutzenden von Dialekten und Hunderten von verschiedenen Implementierungen.

haben Computer endliche Speicher. Programme unter einigen Betriebssystemen kann mit Einschränkungen über die Speichergröße haben. Verschiedene Common Lisp-Implementierungen verwenden unterschiedliche numerische Bibliotheken.

Sie möchten Ihre CLISP Handbuch für seine Grenzen seiner verschiedenen Datentypen konsultieren.

CLISP bereitgestellt, um die Funktion "mod-expt" (oder EXT: mod-expt)

[1]> (mod-expt 2 1000000 59)

53

das ist ziemlich schnell. Und für Ihren Zweck, das funktioniert.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top