Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.87/30: Рейтинг темы: голосов - 30, средняя оценка - 4.87
0 / 0 / 0
Регистрация: 16.01.2013
Сообщений: 59

Алгоритм факторизации. Курсач горит

18.04.2013, 20:15. Показов 6079. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. У меня такая проблема: Я делаю курсовую, называется "Вычисление дискретного логарифма". Я написал уже всю программу(алгоритмом Полига-Хеллмана ). А факторизацию делал с помощью обычного, немного измененного перебора делителей. Тестировал факторизацию на числах 10-20 знаков. И она была достаточно быстрой. Вот код:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
private List<BigInteger> Factoring(BigInteger x)
        {
            BigInteger b, c, n;
            n = x;
            List<BigInteger> ar1 = new List<BigInteger>();
            while ((n % 2) == 0)
            {
                n /= 2;
                ar1.Add(2);
            }
            b = 3;
            c = Sqrt(n) + 1;
            while (b < c)
            {
                if (n % b == 0)
                {
                    ar1.Add(b);
                    n /= b;
                    c = Sqrt(n) + 1;
                }
                else
                    b += 2;
            }
            ar1.Add(n);
            return ar1;
        }
//В итоге получается список с простыми множителями.

И вчера мне научный руководитель сказал, что этот метод фуфло полное и на защите я получу за него люлей. Я думаю реализовать другой алгоритм. Подскажите пожалуйста быстрый алгоритм, который раскладывает на простые множители. И если есть у кого-то реализованный на c# или кто-то хочет помочь,то скиньте код.

Добавлено через 5 минут
P.S. Защита завтра...
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
18.04.2013, 20:15
Ответы с готовыми решениями:

Необходимо реализовать алгоритм Полларда (алгортим факторизации числа n)
Доброго времени суток) Необходимо реализовать алгоритм Полларда (алгортим факторизации числа n). public partial class Form1 : Form ...

Курсач горит огнееем. Тема авто или жд вокзал.
Помогите пожалуйста с курсачем и запиской( по возможности) на C#(авто или жд вокзал без разницы),по времени не успеваю. 1)Введение ...

Горит курсач
Добрый день, у меня такой вопросик, каким образом подключить базу данных сделанную в Visio в С++?

6
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
18.04.2013, 21:50
Предложу Р-алгоритм Полларда как очень простой в реализации, легко параллелющийся и работающий быстрее перебора.
Реализаций в интернете довольно много:
http://masterstech.blogspot.ru... -in-c.html
http://www-ti.informatik.uni-t... hoFac.java
0
0 / 0 / 0
Регистрация: 16.01.2013
Сообщений: 59
18.04.2013, 22:00  [ТС]
Я переделывал в BigInteger тот, что по первой ссылке и он работал медленнее. Там вообще по-моему не Полларда-Ро.
Сами проверьте, если интересно.

Добавлено через 7 минут
И там нужно еще в начале проверять на %2==0 , иначе не простой множитель может попасться. Ну и я еще изменял его, чтобы он записывал в строку множители все и возвращал её.

Добавлено через 58 секунд
Я тестировал на числах ~20-значных.
0
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
18.04.2013, 22:46
Этот алгоритм имеет смысл когда делители числа велики, и перебором их найти не быстро.
Попробуйте сначала перебрать делители, скажем до 10000.
Если ни одного не найдется - вызывайте уже метод Полларда.

Можете взять описание алгоритма с википедии, если сомневаетесь в тех ссылках.

Добавлено через 25 минут
Вот реализация с алгоритмом с википедии и тест-сравнение с перебором. Ищет только один делитель.
На делителях больше 32-х бита стабильно выигрывает р-метод Полларда
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
    class Program
    {
        static void Main(string[] args)
        {
            BigInteger p1 = BigInteger.Parse("62236261583");
            BigInteger p2 = BigInteger.Parse("68226195187");
            BigInteger n = p1*p2;//p1 и p2 - большие простые числа
            new Thread(() =>
                {
                    Console.WriteLine("simple = " + Factorization.fullSimple(n));
                    Console.ReadKey();
                }).Start();
            Console.WriteLine("comlex = " + Factorization.run(n));
            Console.ReadKey();
        }
    }
 
    public static class Factorization
    {
        private static Random r = new Random();
        public static BigInteger run(BigInteger n)
        {
            int simpleResult = simple(n);
            if (simpleResult != 0)
                return simpleResult;
 
            BigInteger x = r.Next(2, int.MaxValue);
            BigInteger y = 1;
            BigInteger i = 0;
            BigInteger stage = 2;
            BigInteger gcd;
            while ((gcd = BigInteger.GreatestCommonDivisor(n, BigInteger.Abs(x - y))) == 1)
            {
                if (i == stage)
                {
                    y = x;
                    stage = stage*2;
                }
                x = BigInteger.ModPow(x, 2, n) + 1;
                i = i + 1;
            }
            return gcd;
        }
 
        private static int simple(BigInteger n)
        {
            if (n % 2 == 0)
                return 2;
            int i = 3;
            while (i < 10000)
            {
                if (n%i == 0)
                    return i;
                i += 2;
            }
            return 0;
        }
 
        public static BigInteger fullSimple(BigInteger n)
        {
            if (n % 2 == 0)
                return 2;
            BigInteger i = 3;
            BigInteger sqrt = n.Sqrt();
            while (i < sqrt)
            {
                if (n % i == 0)
                    return i;
                i += 2;
            }
            return n;
        }
 
        private static BigInteger Sqrt(this BigInteger n)
        {
            if (n == 0) return 0;
            if (n > 0)
            {
                int bitLength = Convert.ToInt32(Math.Ceiling(BigInteger.Log(n, 2)));
                BigInteger root = BigInteger.One << (bitLength / 2);
 
                while (!isSqrt(n, root))
                {
                    root += n / root;
                    root /= 2;
                }
 
                return root;
            }
 
            throw new ArithmeticException("NaN");
        }
 
        private static Boolean isSqrt(BigInteger n, BigInteger root)
        {
            BigInteger lowerBound = root * root;
            BigInteger upperBound = (root + 1) * (root + 1);
 
            return (n >= lowerBound && n < upperBound);
        }
    }

PS. Большие простые числа можно генерировать например так - http://ideone.com/Mxw51i (там запускается стандартный java генератор)
0
Higher
 Аватар для diagon
1953 / 1219 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
18.04.2013, 23:20
Цитата Сообщение от Denmarino Посмотреть сообщение
научный руководитель
Набебин? :)

Во-первых, BigInteger люто тормозит. Но переделывать под что-то другое тебе уже поздновато...
Хотя, я для своей факторизации написал обертку над gmp(точнее, допилил этот код), могу скинуть.
Моя факторизация слишком мощная и тормознутая, тебе она не подойдет :) Лучше оставь текущую (но запили нормальную длинную арифметику, а то у тебя даже % 2 сильно тормозит из-за косячного BigInteger'a), либо найди где-нибудь реализацию p-1 Полларда.
0
0 / 0 / 0
Регистрация: 04.11.2017
Сообщений: 5
26.03.2018, 01:12
Выбирай:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
unsigned __int128 pollard_brent(unsigned __int128 n) {//Поллард0-Брент
register unsigned __int128 x=2, y=mulmod(x,x,n)+1; unsigned __int128 yp=y, mm, a, ab, gc; unsigned l, st=1;
M: l=st; do{for(mm=0,a=y;y;y>>=1) {if(y&1) mm=(mm+a)%n; a=(a<<1)%n;} y=mm; y++;
if (y>x) ab=y-x; else ab=x-y; gc=n; while(ab&&gc) if(ab>gc) ab%=gc; else gc%=ab; gc=ab|gc;//gc=НОД(abs(y-x),n)
if(gc!=1) {if(gc==n) return 0; return gc;} l--;} while(l); x=yp; yp=y; st<<=1; goto M;}
 
unsigned __int128 pollard_floyd(unsigned __int128 n) {//Полард0-Флойд
register unsigned __int128 x=2, y=x;/*x=rand()%n*/
unsigned __int128 a, mm;
M: for(mm=0,a=x;x;x>>=1) {if(x&1) mm=(mm+a)%n; a=(a<<1)%n;} x=mm; x++;
 for(mm=0,a=y;y;y>>=1) {if(y&1) mm=(mm+a)%n; a=(a<<1)%n;} y=mm; y++;
 for(mm=0,a=y;y;y>>=1) {if(y&1) mm=(mm+a)%n; a=(a<<1)%n;} y=mm; y++;
if(gcd(n,abs_(y-x))!=1) {if(gcd(abs_(y-x),n)==n) return 0; return gcd(abs_(y-x),n);} goto M;}
 
unsigned __int128 pollard_p_1(unsigned __int128 n){//Полард1
const unsigned __int128 b1=13; unsigned __int128 a=2,g; unsigned i,e; const unsigned qp=300;
A: for(i=0;i<qp;i++){//вычисляем a^M
e=log((long double)b1)/log((long double)qpr[i]);
a=powmod(a,powmod(qpr[i],e,n),n);//a=mulmod(a,powmod(q[i],e,n),n);
g=gcd(a-1,n); if(g>1 && g<n) return g;}
if(g==n) {while(gcd(a,n)!=1) {a=mulmod(a,a,n); a+=3; a%=n;} goto A;}
unsigned __int64 p[]={4,2,4,6,2,6,4,2,4,6,6,2,6,4,2,6,4,6,8,4,2,4,2,4,14,4,6,2,10,2,6,6,4};//33
for(i=0;i<33;i++) {a=mulmod(a,powmod(a,p[i],n),n); g=gcd(a-1,n); if (g!=1) return g;} return 0;}
0
83 / 1 / 0
Регистрация: 08.11.2017
Сообщений: 146
29.03.2018, 11:39
Цитата Сообщение от turbanoff Посмотреть сообщение
Предложу Р-алгоритм Полларда
Тоже тормознутый алгоритм с экспоненциальной трудоёмкостью.
С другой стороны - самый быстрый "алгоритм решета числового поля" - очень трудно реализовать.

Потому самый лучший - это конечно, "Алгоритм факторизации методом эллиптических кривых".
И реализуется достаточно просто, и памяти много не требует, и сложность суб-экспоненциальная.
Если написать грамотно, то 256-битные числа за считанные минуты факторизуются на домашнем ПК. А это в десятичной системе - 77-значное число.
Сам не писал, но вот читал что так работает. За такой алгоритм, преподаватель по курсачу должен 10 баллов поставить

Цитата Сообщение от diagon Посмотреть сообщение
из-за косячного BigInteger'a
Вот я не могу понять, если BigInteger - такой косячный и тормознутый, почему никто ничего лучше не написал для
.NET? Или написали, но я найти не могу?

Почему он тормознутый, я понимаю, достаточно было с помощью рефлектора присмотреться к его коду..

Добавлено через 10 минут
Цитата Сообщение от Andrey1302 Посмотреть сообщение
Выбирай:
Цитата Сообщение от Andrey1302 Посмотреть сообщение
unsigned __int128
Отлично! Давно интересовался. И что же нужно сделать, чтобы этот __int128 заработал?
Я пробовал даже GCC поставить - не работает (не компилировалось).
Дальше разбираться, какие шаманские действия надо сделать, чтобы заработал, уже не стал.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
29.03.2018, 11:39
Помогаю со студенческими работами здесь

Построение нескольких графиков. курсач горит!
Здравствуйте. такая проблема необходимо построить несколько графиков в одной системе координат, но только так чтобы для каждого...

Не могу разобраться с Combobox в Делфи, курсач горит!
Вот такая проблема: Мне дали курсовую, на тему «Разработка автоматизированной подсистемы учета и анализа продаж подержанных автомобилей», я...

Написать программу, которая умножает матрицы.... Курсач горит!!!!!
Кто это знает, и может помочь в написании слейдущей программы, помогите пожайлуста: Написать программу, которая умножает матрицы,...

Курсач горит,нужно организовать удаление каталогов и копирование каталогов
Народ кто нито помогите с курсачем нужно что бы каталоги удалял с запросом и каталоги перемещал,а то не получается(( очень надо

Алгоритм регестрации проверьте/исправьте.горит(
Привет!При входе в программу сделана регестрация/аторизация.Если ты зарегестрирован то вводишь данные ,нажимаешь авторизация - откриваеться...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru