программно разложить на множители большое число

хорошо, поэтому у меня огромное количество f. На самом деле это число имеет длину чуть более 100 цифр. Я знаю, что факторы примерно одинакового размера.

Если у меня ограниченные ресурсы и время, какой язык и алгоритм я должен использовать? Я включаю продолжительность времени для кодирования алгоритма в ограниченное время.

мысли?

EDIT: ограниченно, я имею в виду в наименьшее возможное количество времени.

3 ответов


современный алгоритм простой факторизации является квадратичного решета и его вариантов. Для чисел, превышающих 100 цифр,номер ячейки становится более эффективным.

существует реализация с открытым исходным кодом здесь. Он способен разложить 100-значное число на два примерно равных простых числа только в 4 часа на 2,2 ГГц AMD Althon.

Так есть алгоритм и пример реализации. Что может быть достаточно, чтобы дать вам идеи или начать.


Это звучит как хорошее упражнение (и, возможно, редкий хороший пример) для облачных вычислений. Это должно быть легко запустить параллельную обработку. Разделите пулы факторов между процессами.

Что-то вроде этого может оказаться полезным: http://blog.controlgroup.com/2010/10/13/hadoop-and-amazon-elastic-mapreduce-analyzing-log-files/ больше деталей на http://en.wikipedia.org/wiki/Apache_Hadoop#Hadoop_on_Amazon_EC2.2FS3_services .

(в прошлом месяце я смотрел хорошее видео-демонстрацию doming что - то похожее на то, что я предлагаю здесь, но, конечно, теперь я не могу найти ссылку.)

особенно, если вам не нужно делать это программно, взгляните на http://www.alpertron.com.ar/ECM.HTM . (Связано с from http://en.wikipedia.org/wiki/Quadratic_sieve.) Обратите особое внимание на примечания в разделе "Факторинг числа в нескольких машинах" на первое звено. (Поскольку исходный код доступен, вы можете запустить это программно распределенный способ, используя Hadoop или тому подобное.)


while (x < Number) {
    if ((Number % x) == 0 ) { 
        cout << x << "*" << Number/x << endl;
        ++x;
    }  
    else ++x;
}