powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Ещё раз о тесте Ферма
25 сообщений из 283, страница 5 из 12
Ещё раз о тесте Ферма
    #39850813
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Полностью исходники (зеркало) OpenJDK можно скачать здесь https://github.com/unofficial-openjdk/openjdk
...
Рейтинг: 0 / 0
Ещё раз о тесте Ферма
    #39850814
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В код также забито много некрасивых и математически неясных "гвоздей".
Это связано с тем что создатели этого BitInteger беспокоились лишь о том
чтобы код работал быстро. Ясность чтения исходника их не беспокоила.

Вот данное выражение

Код: java
1.
result.bitLength() > 6



следует читать так.

Если переменная result имеет разрядную сетку больше чем 6 бит. По сути 6 бит это число более чем 64.
Еще аналог - целое логарифмирование по основанию 2.
...
Рейтинг: 0 / 0
Ещё раз о тесте Ферма
    #39850859
Gennadiy Usov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В питоне запустил программу по поиску составных чисел, удовлетворяющих тесту Ферма.

Рассмотрено 10 000 007 чисел.

Из них - 664575 простых чисел.

Тесту Ферма удовлетворяют 685 составных чисел.

Где-то 1 : 100

Максимальный из минимальных множителей составных чисел - 2971.
...
Рейтинг: 0 / 0
Ещё раз о тесте Ферма
    #39850877
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так я самый первый исходник не до конца скопипастил.

Вобщем если длина числа меньше SMALL_PRIME_THRESHOLD (95 бит) то в бой идут алгоритмы
прямого брутфорса. Потом Миллера Раввина в пересечечии с Люка-Лемьером. Причем идет
пересеченеи условий. Необходимое - Миллер. Достаточное - Люка. Насколько я понимаю
здесь должен быть 100% детерминимзм. Не зря они сетку ограничивали.

Если разрядность числа выше 95 бит то дальше создается битовое решето (BitSieve). Как оно работает
в данном алгоритме я не изучал. Что это за метод? Эратосфен или нет не знаю.

Алгоритм искусственно останавливается когда разрядная решетка достигает 500000000 бит и выдает ошибку.
Это ограничение было введено в 2013 году.

Далее эта формула.

Код: sql
1.
int searchLen = getPrimeSearchLen(result.bitLength());



Это что-то типа шага по решетке. Вычисляется как bitLength / 20 * 64.



Код: java
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.
    public BigInteger nextProbablePrime() {
        if (this.signum < 0)
            throw new ArithmeticException("start < 0: " + this);

        // Handle trivial cases
        if ((this.signum == 0) || this.equals(ONE))
            return TWO;

        BigInteger result = this.add(ONE);

        // Fastpath for small numbers
        if (result.bitLength() < SMALL_PRIME_THRESHOLD) {

            // Ensure an odd number
            if (!result.testBit(0))
                result = result.add(ONE);

            while (true) {
                // Do cheap "pre-test" if applicable
                if (result.bitLength() > 6) {
                    long r = result.remainder(SMALL_PRIME_PRODUCT).longValue();
                    if ((r%3==0)  || (r%5==0)  || (r%7==0)  || (r%11==0) ||
                        (r%13==0) || (r%17==0) || (r%19==0) || (r%23==0) ||
                        (r%29==0) || (r%31==0) || (r%37==0) || (r%41==0)) {
                        result = result.add(TWO);
                        continue; // Candidate is composite; try another
                    }
                }

                // All candidates of bitLength 2 and 3 are prime by this point
                if (result.bitLength() < 4)
                    return result;

                // The expensive test
                if (result.primeToCertainty(DEFAULT_PRIME_CERTAINTY, null))
                    return result;

                result = result.add(TWO);
            }
        }

        // Start at previous even number
        if (result.testBit(0))
            result = result.subtract(ONE);

        // Looking for the next large prime
        int searchLen = getPrimeSearchLen(result.bitLength());

        while (true) {
           BitSieve searchSieve = new BitSieve(result, searchLen);
           BigInteger candidate = searchSieve.retrieve(result,
                                                 DEFAULT_PRIME_CERTAINTY, null);
           if (candidate != null)
               return candidate;
           result = result.add(BigInteger.valueOf(2 * searchLen));
        }
    }

...
Рейтинг: 0 / 0
Ещё раз о тесте Ферма
    #39850899
Gennadiy Usov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maytonТак я самый первый исходник не до конца скопипастил.
Вобщем если длина числа меньше SMALL_PRIME_THRESHOLD (95 бит) то в бой идут алгоритмы
прямого брутфорса. Потом Миллера Раввина в пересечечии с Люка-Лемьером. Причем идет
пересеченеи условий. Необходимое - Миллер. Достаточное - Люка. Насколько я понимаю
здесь должен быть 100% детерминимзм. Не зря они сетку ограничивали.
Если разрядность числа выше 95 бит то дальше создается битовое решето (BitSieve). Как оно работает
в данном алгоритме я не изучал. Что это за метод? Эратосфен или нет не знаю.
Алгоритм искусственно останавливается когда разрядная решетка достигает 500000000 бит и выдает ошибку.
Это ограничение было введено в 2013 году.Я так понимаю, что есть интерес разобраться с диапазоном целых чисел.

А задача будет выглядеть так:

На произвольном диапазоне определить простые числа
(или определить составные числа из определённой последовательности целых чисел).


Если рассматривать такую задачу, то необходимо задачу разделить на подзадачи, и рассматривать постепенно эти подзадачи.

Подзадача 1. Выбор последовательности целых чисел.

Возможны следующие варианты:
- нечётные числа;
- числа 6К+-1
- числа из блоков 21812001 :30, 210, 2310, и т.д.
(о таких блоках известно из вики, при этом считается,
что блок 210 и более не несёт существеного убыстрения работы программы)

То есть, такими блоками ограничивается количества перебираемых целых чисел.

Я использовал в 21952070 2-й вариант
Код: sql
1.
2.
3.
4.
5.
6.
d = 2							
p = 7							
P = p + 1000000							
while p <= P: 							
	d = 6 - d						
	p = p + d
...
Рейтинг: 0 / 0
Ещё раз о тесте Ферма
    #39850902
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не особо. Я просто комментирую то как nextPrime уже реализован в языковых библиотеках.
...
Рейтинг: 0 / 0
Ещё раз о тесте Ферма
    #39850904
Gennadiy Usov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maytonНе особо. Я просто комментирую то как nextPrime уже реализован в языковых библиотеках..... и пишу простенькие программы в порядке комментария
...
Рейтинг: 0 / 0
Ещё раз о тесте Ферма
    #39850912
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Меня интересовал Radix tree/trie. И всякие сжатые форматы хранения аналитики.

А простые числа просто под руку подвернулись.
Как хороший источник шума со свойствами.

Вот такой вот загадочный мотиватор.
...
Рейтинг: 0 / 0
Ещё раз о тесте Ферма
    #39851900
Gennadiy Usov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В продолжение сообщения 21952153 привожу код по перебору целых чисел с помощью массива
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
my_list = [30, 8, 1, 7, 11, 13, 17, 19, 23, 29]	
nm = my_list [0]		
em = my_list [1] - 1		
p0 = 0		
w = 0		
P = 10000007		
w1 = P//nm		
while w <= w1:		
	we = 1	
	we1 = we + em	
	while we <= we1:	
		p = p0 + (w-1) * nm +my_list [we + 1]
		
		we += 1
	w += 1	
...
Рейтинг: 0 / 0
Ещё раз о тесте Ферма
    #39851904
Gennadiy Usov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maytonВобщем если длина числа меньше SMALL_PRIME_THRESHOLD (95 бит) то в бой идут алгоритмы
прямого брутфорса. Вопрос:

а зачем нам нужны числа, меньше SMALL_PRIME_THRESHOLD (95 бит)?

Например, факторизатор "Империя чисел" работает с числами 10^60
...
Рейтинг: 0 / 0
Ещё раз о тесте Ферма
    #39851944
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gennadiy UsovmaytonВобщем если длина числа меньше SMALL_PRIME_THRESHOLD (95 бит) то в бой идут алгоритмы
прямого брутфорса. Вопрос:

а зачем нам нужны числа, меньше SMALL_PRIME_THRESHOLD (95 бит)?

Например, факторизатор "Империя чисел" работает с числами 10^60
Не знаю. Могу предположить что эта точка была выбрана на графике экспериментально.
Эта точка делит множество чисел на два направления. Первое - это брутфорс + миллер-рабин + люка лемьер.
Второе это Решето неизвестного типа. Экперимент мог заключаться в выборе наименьшего времени отклика.
Там где два графика отклика пересеклись - там и взяли эту точку. Поскольку Люка Лемьер как самый главный
точный и детерминированный алгоритм имеет комплексность порядка O(n^3) то график мог вырасти быстро
до времени неприемлимого для человеческого ожидания.

Хотя... могли брать по другому принципу.
...
Рейтинг: 0 / 0
Ещё раз о тесте Ферма
    #39851948
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gennadiy UsovНапример, факторизатор "Империя чисел" работает с числами 10^60
Что такое империя чисел - понятия не имею. Не слыхал. Сколько она потребляет памяти.
И каких вычислительных ресурсов ей надо. Может ей нужен дата-центр с 1000 процессорами
и пета-байтом кеша расчётных чисел. Можем ли мы это применить в быту? Или в рамках наших
скромных задач на sql.ru?

И не забывайте что факторизация и тест на простоту это всё-таки не совсем одно и то-же.
...
Рейтинг: 0 / 0
Ещё раз о тесте Ферма
    #39851970
Gennadiy Usov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maytonGennadiy UsovНапример, факторизатор "Империя чисел" работает с числами 10^60
Что такое империя чисел - понятия не имею. Не слыхал. Сколько она потребляет памяти.
И каких вычислительных ресурсов ей надо. Может ей нужен дата-центр с 1000 процессорами
и пета-байтом кеша расчётных чисел. Можем ли мы это применить в быту? Или в рамках наших
скромных задач на sql.ru?Факторизатор "Империя чисел" - это :
https://ru.numberempire.com/

Этот факторизатор удобен только для отдельных чисел.maytonИ не забывайте что факторизация и тест на простоту это всё-таки не совсем одно и то-же.Но у них общие "корни".
...
Рейтинг: 0 / 0
Ещё раз о тесте Ферма
    #39851974
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gennadiy Usovmaytonпропущено...

Что такое империя чисел - понятия не имею. Не слыхал. Сколько она потребляет памяти.
И каких вычислительных ресурсов ей надо. Может ей нужен дата-центр с 1000 процессорами
и пета-байтом кеша расчётных чисел. Можем ли мы это применить в быту? Или в рамках наших
скромных задач на sql.ru?Факторизатор "Империя чисел" - это :
https://ru.numberempire.com/

Этот факторизатор удобен только для отдельных чисел.maytonИ не забывайте что факторизация и тест на простоту это всё-таки не совсем одно и то-же.Но у них общие "корни".
Ну ты видел что поиск следующего простого содержит как минимум бутерброд из 4х разных алгоритмов?

Зачем ты говоришь про общие корни? Как мы твои корни натянем на эту практическую реализацию.
Я понимаю ты идеалист. Я тебе еще в ферзевой задаче говорил что мы должны подходить очень
селективно к алгоритму основываясь на разной природе входных данных. Серебрянной пули не будет.
У нас будет десяток бронзовых пуль каждая из которых хорошо работает в данном диапазоне чисел
или ферзей или вектора входных данных и очень-очень плохо работаает на другом векторе входа.
...
Рейтинг: 0 / 0
Ещё раз о тесте Ферма
    #39851978
Gennadiy Usov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maytonGennadiy UsovВопрос:
а зачем нам нужны числа, меньше SMALL_PRIME_THRESHOLD (95 бит)?Не знаю. Могу предположить что эта точка была выбрана на графике экспериментально.
....
Хотя... могли брать по другому принципу.Могу предположить, что число SMALL_PRIME_THRESHOLD (95 бит) не связано с исследуемым числом.

Скорее всего, здесь имеет место скорость вычислений: когда удобно так, а когда удобнее этак.

Сейчас попробую проверить на 1000... повторных вычислений скорость определения:
- остатка по тесту Ферма для большого числа
- остатка после деления этого большого числа на серию произвольных чисел.
...
Рейтинг: 0 / 0
Ещё раз о тесте Ферма
    #39851986
Gennadiy Usov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maytonИ не забывайте что факторизация и тест на простоту это всё-таки не совсем одно и то-же.Но у них общие "корни".
maytonНу ты видел что поиск следующего простого содержит как минимум бутерброд из 4х разных алгоритмов?
Зачем ты говоришь про общие корни? Как мы твои корни натянем на эту практическую реализацию.
Я понимаю ты идеалист. Я тебе еще в ферзевой задаче говорил что мы должны подходить очень
селективно к алгоритму основываясь на разной природе входных данных. Серебрянной пули не будет.
У нас будет десяток бронзовых пуль каждая из которых хорошо работает в данном диапазоне чисел
или ферзей или вектора входных данных и очень-очень плохо работаает на другом векторе входа.А кто сказал, что будет один алгоритм?

Для поиска простых чисел и факторизации чисел используются одни и те же алгоритмы.

Или разные?
...
Рейтинг: 0 / 0
Ещё раз о тесте Ферма
    #39851997
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Рабин Миллер не факторизирует. И брут-форс просто определяет что число разделилсь на 1 делитель нацело. Например на 3.
Дальше - не идет. Алгоритм закончен. Число - составное.
...
Рейтинг: 0 / 0
Ещё раз о тесте Ферма
    #39852011
Gennadiy Usov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maytonРабин Миллер не факторизирует. И брут-форс просто определяет что число разделилсь на 1 делитель нацело. Например на 3.
Дальше - не идет. Алгоритм закончен. Число - составное.А если не нашелся делитель,
то когда нужно остановиться?
Ведь число очень-очень большое.
...
Рейтинг: 0 / 0
Ещё раз о тесте Ферма
    #39852019
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gennadiy UsovmaytonРабин Миллер не факторизирует. И брут-форс просто определяет что число разделилсь на 1 делитель нацело. Например на 3.
Дальше - не идет. Алгоритм закончен. Число - составное.А если не нашелся делитель,
то когда нужно остановиться?
Ведь число очень-очень большое.
Геннадий. Я вас уже считаю разработчиком. Читайте код. Последний делитель который мы делим методом грубой силы это число 41.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
 while (true) {
                // Do cheap "pre-test" if applicable
                if (result.bitLength() > 6) {
                    long r = result.remainder(SMALL_PRIME_PRODUCT).longValue();
                    if ((r%3==0)  || (r%5==0)  || (r%7==0)  || (r%11==0) ||
                        (r%13==0) || (r%17==0) || (r%19==0) || (r%23==0) ||
                        (r%29==0) || (r%31==0) || (r%37==0) || (r%41==0)) {
                        result = result.add(TWO);
                        continue; // Candidate is composite; try another
                    }
                }

                // All candidates of bitLength 2 and 3 are prime by this point
                if (result.bitLength() < 4)
                    return result;

                // The expensive test
                if (result.primeToCertainty(DEFAULT_PRIME_CERTAINTY, null))
                    return result;

                result = result.add(TWO);
            }
...
Рейтинг: 0 / 0
Ещё раз о тесте Ферма
    #39852027
Gennadiy Usov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maytonGennadiy UsovА если не нашелся делитель,
то когда нужно остановиться?
Ведь число очень-очень большое.
Геннадий. Я вас уже считаю разработчиком. Читайте код. Последний делитель который мы делим методом грубой силы это число 41.
Спасибо за доверие!

А почему 41, а не 43, а не 61, а не ....?
...
Рейтинг: 0 / 0
Ещё раз о тесте Ферма
    #39852058
Gennadiy Usov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Решил сравнить время на проведение операция для большого числа в двух вариантах:
- тест Ферма
- деление на множество делителей.

Получилось, что за 3 сек. можно найти для числа p = pow(2, 1023) + 345 :
- 1000 тестов Ферма
- 5 000 000 делений на делители.

Получилось, что за 3 сек. можно найти для другого числа p = pow(2, 2023) + 89 :
- 150 тестов Ферма
- 3 000 000 делений на делители.
...
Рейтинг: 0 / 0
Ещё раз о тесте Ферма
    #39852314
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gennadiy Usovmaytonпропущено...

Геннадий. Я вас уже считаю разработчиком. Читайте код. Последний делитель который мы делим методом грубой силы это число 41.
Спасибо за доверие!

А почему 41, а не 43, а не 61, а не ....?

Я всё таки еще упрощу этот цикл. Как я уже говорил Java не годится для работы с длинными целыми. Разверну эти
толстые функции типа reminder. Под капотом у нее бутерброд из двух алгоритмов remainderKnuth и remainderBurnikelZiegler.
Надеюсь это просто какие-то оптимизации быстрого остатка от деления. Первый из них носит гордую фамилию Кнута.
Это радует.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
 while (true) {
                // Do cheap "pre-test" if applicable
                if (result.bitLength() > 6) {
                    long r = result % (3*5*7*11*13*17*19*23*29*31*37*41);
                    if ((r%3==0)  || (r%5==0)  || (r%7==0)  || (r%11==0) ||
                        (r%13==0) || (r%17==0) || (r%19==0) || (r%23==0) ||
                        (r%29==0) || (r%31==0) || (r%37==0) || (r%41==0)) {
                        result = result.add(TWO);
                        continue; // Candidate is composite; try another
                    }
                }

                // All candidates of bitLength 2 and 3 are prime by this point
                if (result.bitLength() < 4)
                    return result;

                // The expensive test (здесь Миллер-Раввин и Люка Лемьер)
                if (result.primeToCertainty(DEFAULT_PRIME_CERTAINTY, null))
                    return result;

                result = result.add(TWO);
            }
...
Рейтинг: 0 / 0
Ещё раз о тесте Ферма
    #39852331
Gennadiy Usov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maytonGennadiy UsovА почему 41, а не 43, а не 61, а не ....?Я всё таки еще упрощу этот цикл. Как я уже говорил Java не годится для работы с длинными целыми. Разверну эти
толстые функции типа reminder. Под капотом у нее бутерброд из двух алгоритмов remainderKnuth и remainderBurnikelZiegler.
Надеюсь это просто какие-то оптимизации быстрого остатка от деления. Первый из них носит гордую фамилию Кнута.
Это радует.Вы не ответили на вопрос: почему последнее простое число 41.

Я попробую представить свой вариант части кода (начало цикла, остальное - в зависимости от применения)
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
#p - исходное число			
prost_list = [23,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,79,83,89]			
s1 = 1			
sn = prost_list[0]			
while s1 <= sn:			
	q = prost_list[s1]		
	w2 = p % q		
		if w2 == 0:	
			 и т.д.

Количество простых чисел в массиве можно увеличить
...
Рейтинг: 0 / 0
Ещё раз о тесте Ферма
    #39852334
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я не знаю почему 41. Я просто разворачиваю вложенность сорца и представляю его на суд в форуме
в читабельном виде.

Предположительно это другая экспериментальная константа которая была забита в код на основании
замеров времени как оптимум.
...
Рейтинг: 0 / 0
Ещё раз о тесте Ферма
    #39852352
Gennadiy Usov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maytonПотом Миллера Раввина в пересечечии с Люка-Лемьером. Причем идет
пересеченеи условий. Необходимое - Миллер. Достаточное - Люка. Насколько я понимаю
здесь должен быть 100% детерминимзм. Не зря они сетку ограничивали.В вики записано:

"Тест Люка — Лемера — полиномиальный, детерминированный и безусловный (то есть не зависящий от недоказанных гипотез)
тест простоты для чисел Мерсенна ."
(или для чисел, расположенных рядом с числами Мерсенна)

Для остальных чисел этот тест не подходит.

Если это не так, то приведите пример, желательно, на небольших числах.
...
Рейтинг: 0 / 0
25 сообщений из 283, страница 5 из 12
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Ещё раз о тесте Ферма
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]