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