PDA

Просмотр полной версии : Операции с Number


BuKT
17.02.2011, 02:16
Решил через Теорему Вильсона (http://regiomontan.narod.ru/01_Vilson.html) кое-чего доказать. И столкнулся с неприятной багой.


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!!!

Кто-нибудь знает, как с этим бороться?
Или, если нет, есть ли другой относительно быстрый и/или легко реализуемый на АСкрипте алгоритм проверки числа на простоту?

i.o.
17.02.2011, 02:36
ну а что вы хотите от числа двойной точности?

BuKT
17.02.2011, 03:21
Альтернативы =)

Получается, когда я указываю 22-х рязрядное число, он создаёт под него участок памяти с плавающей точкой?

i.o.
17.02.2011, 03:25
если хотите точности - пишите или ищите библиотеки для работы с длинной арифметикой.
А тут - 64х битное число с плавающей запятой. Вы на нем никогда точно не вычислите большой факториал. Нужны целочисленные типы.

BuKT
17.02.2011, 03:45
Честно говоря, никогда не работал с большими числами, потому и спрашиваю про альтернативу.

В принципе, уже набросал в мозгу примерное решение проблемы со своей реализацией больших чисел через композицию базовых численных классов. Но класс же не может иметь одним из полей экземпляр самого себя?

i.o.
17.02.2011, 03:46
Но класс же не может иметь одним из полей экземпляр самого себя?
Ничто не запрещает :)

BuKT
17.02.2011, 06:02
Неужели прямо без ограничений? Или что-нибудь вроде "не инициализировать в конструкторе" есть?