Показать сообщение отдельно
Старый 17.02.2011, 02:16
BuKT вне форума Посмотреть профиль Отправить личное сообщение для BuKT Найти все сообщения от BuKT
  № 1  
Ответить с цитированием
BuKT
 
Аватар для BuKT

блогер
Регистрация: Dec 2010
Сообщений: 237
Записей в блоге: 5
По умолчанию Операции с Number

Решил через Теорему Вильсона кое-чего доказать. И столкнулся с неприятной багой.

Код AS3:
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!
Ок, думаю, что-то не то. Проверил в калькуляторе - всё получается. Решил оттрейсить без всяких переменных.

Код AS3:
//Большое число - факториал 22 по версии виндового калькулятора
trace ((1124000727777607680001)/23); //48869596859895990000
//Но
trace ((1124000727777607680001)%23); //22!!!
Кто-нибудь знает, как с этим бороться?
Или, если нет, есть ли другой относительно быстрый и/или легко реализуемый на АСкрипте алгоритм проверки числа на простоту?