Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Операции с Number (http://www.flasher.ru/forum/showthread.php?t=150734)

BuKT 17.02.2011 02:16

Операции с 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!!!

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

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

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


Часовой пояс GMT +4, время: 18:07.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.