|
|
|||||
Операции с Number
Решил через Теорему Вильсона кое-чего доказать. И столкнулся с неприятной багой.
var factArr:Array = new Array(); factArr[0] = 0; factArr[1] = 1; factArr[2] = 2; factArr[3] = 6; function getFact(i:Number):Number { if (factArr[i]) { return factArr[i]; } factArr[i] = i*getFact(i-1); return factArr[i]; } //Если коротко - getFact возвращает факториал. Правильно возвращает. По возможности - запоминает расчёты. var p = 23; //Явно простое число; //Теорема Вильсона trace (Boolean((getFact(p-1) + 1)%p == 0)); //false! //Большое число - факториал 22 по версии виндового калькулятора trace ((1124000727777607680001)/23); //48869596859895990000 //Но trace ((1124000727777607680001)%23); //22!!! Или, если нет, есть ли другой относительно быстрый и/или легко реализуемый на АСкрипте алгоритм проверки числа на простоту? |
|
|||||
Регистрация: Apr 2010
Адрес: Earth
Сообщений: 1,897
|
ну а что вы хотите от числа двойной точности?
__________________
Загружаем картинки, минуя ошибки безопасности |
|
|||||
Регистрация: Apr 2010
Адрес: Earth
Сообщений: 1,897
|
если хотите точности - пишите или ищите библиотеки для работы с длинной арифметикой.
А тут - 64х битное число с плавающей запятой. Вы на нем никогда точно не вычислите большой факториал. Нужны целочисленные типы.
__________________
Загружаем картинки, минуя ошибки безопасности |
|
|||||
Честно говоря, никогда не работал с большими числами, потому и спрашиваю про альтернативу.
В принципе, уже набросал в мозгу примерное решение проблемы со своей реализацией больших чисел через композицию базовых численных классов. Но класс же не может иметь одним из полей экземпляр самого себя? |
|
|||||
Регистрация: Apr 2010
Адрес: Earth
Сообщений: 1,897
|
Цитата:
__________________
Загружаем картинки, минуя ошибки безопасности |
Часовой пояс GMT +4, время: 19:31. |
|
« Предыдущая тема | Следующая тема » |
|
|