2010-07-02 2 views
2

я пытаюсь получить первую LISP программы для работы с помощью реализации CLISP, набравпереполнения CLISP после умножения

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

в REPL.

но это дает мне *** - overflow during multiplication of large numbers. Я думал, что lisp имеет произвольный размер/точность. как это могло случиться тогда?

+0

или скомпилировать его как-то решить эту проблему? – guest

+0

, к которому это может относиться, это 97-я проблема из проекта euler :) – guest

ответ

2

В соответствии с http://clisp.cons.org/impnotes/num-concepts.html максимальный размер для бигма составляет (2^2097088 - 1), а ваш 2^7830457 намного больше.

Может быть, вы можете посмотреть на разрушение этого числа - возможно выделить ряд меньших 2^X факторов ...

+0

Похоже, что бигномы хранятся с 2 байтами для длины числа в 4-байтных словах. Интересно, что потребуется, чтобы увеличить это до 3 или 4 байта для длины. – Gabe

1

Lisp - это семейство языков с десятками диалектов и сотнями различных реализаций.

Компьютеры имеют ограниченную память. Программы в некоторых операционных системах могут иметь ограничения на размер памяти. Различные реализации Common Lisp используют разные числовые библиотеки.

Возможно, вам понадобится обратиться к руководству CLISP за ограничениями его различных типов данных.

2

Скорее всего, есть лучший способ решить эту проблему. Я не сделал это так далеко на PE, но я знаю, что некоторые из тех, что я сделал до сих пор, имеют тенденцию иметь «ага!». решения проблем, которые кажутся из ряда компьютерных программ.

Этот особенный - 2^7830457 - огромный номер - попробуйте (format t "~r" (expt 2 160)). Вы можете попытаться взглянуть на проблему в новом свете и посмотреть, есть ли способ взглянуть на нее, о которой вы не подумали.

0

CLISP при условии, что функция "моды-EXPT" (или EXT: моды-EXPT)

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

53 

который довольно быстро. И для вашей цели, которая работает.

Смежные вопросы