274 цифры
4444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444000000000000000000000000000000000000000000000000000000000000000000000000000000001111111111111111111111111111111
Это заняло около 20 часов процессорного времени, чтобы найти, и около 2 минут на простое, чтобы доказать. Напротив, решение из 84 цифр можно найти примерно за 3 минуты.
84 цифры
444444444444444444444444444444444444444444444444441111111113333333333333333333333333
77777777999999999999999777777777 (32 цифры)
66666666666666622222222222222333 (32 цифры)
647777777777777777777777777 (27 цифр)
44444441333333333333 (20 цифр)
999996677777777777 (18 цифр)
167 (15 цифр) 1677
Я рекомендую этот инструмент, если вы хотите подтвердить первичность: апплет D. Alpern's ECM
Также используется подход repdigit, который, по-видимому, является подходом, который наиболее вероятно находит большие значения. Следующий скрипт алгоритмически пропускает большинство чисел или усечений, что приведет к кратности 2, 3, 5 и теперь 11 c / o PeterTaylor (его вклад увеличил эффективность примерно на 50%).
from my_math import is_prime
sets = [
(set('147'), set('0147369'), set('1379')),
(set('369'), set('147'), set('1379')),
(set('369'), set('0369'), set('17')),
(set('258'), set('0258369'), set('39')),
(set('369'), set('258'), set('39'))]
div2or5 = set('024568')
for n in range(3, 100):
for sa, sb, sc in sets:
for a in sa:
for b in sb-set([a]):
bm1 = int(b in div2or5)
for c in sc-set([b]):
if int(a+b+c)%11 == 0: continue
for na in xrange(1, n-1, 1+(n&1)):
eb = n - na
for nb in xrange(1, eb-bm1, 1+(~eb&1)):
nc = eb - nb
if not is_prime(long(a*(na-1) + b*nb + c*nc)):
continue
if not is_prime(long(a*na + b*(nb-1) + c*nc)):
continue
if not is_prime(long(a*na + b*nb + c*(nc-1))):
continue
if not is_prime(long(a*na + b*nb + c*nc)):
continue
print a*na + b*nb + c*nc
my_math.py
можно найти здесь: http://codepad.org/KtXsydxK В
качестве альтернативы, вы также можете использовать gmpy.is_prime
функцию: GMPY Project
Некоторые небольшие улучшения скорости в результате профилирования. Проверка первичности для самого длинного из четырех кандидатов была перемещена до конца, xrange
заменяет range
и long
заменяет int
приведение типов. int
кажется, что есть лишние издержки, если вычисленное выражение приводит к long
.
Правила делимости
Пусть N будет положительным целым числом вида a ... ab ... bc ... c , где a , b и c - повторяющиеся цифры.
На 2 и 5
- во избежание деления на 2 и 5 , c может не входить в набор [0, 2, 4, 5, 6, 8] . Кроме того, если b является членом этого набора, длина c может быть не менее 2.
По 3
- если N = 1 (мод 3) , то N может не содержать ни одного из [1, 4, 7] , так как удаление любого из них тривиально приведет к кратному 3 . Аналогично для N = 2 (мод 3) и [2, 5, 8] . Эта реализация использует слегка ослабленную форму этого: если N содержит один из [1, 4, 7] , он может не содержать ни одного из [2, 5, 8] , и наоборот. Кроме того, N может состоять не только из [0, 3, 6, 9] . Это в значительной степени эквивалентное утверждение, но оно допускает некоторые тривиальные случаи, например a , b и cкаждый повторяется кратно 3 раза.
К 11
- как отмечает ПитерТейлор , если N имеет форму aabbcc ... xxyyzz , то есть он состоит только из цифр, повторяемых четное число раз, он тривиально делится на 11 : a0b0c ... x0y0z . Это наблюдение устраняет половину пространства поиска. Если N имеет нечетную длину, то длина a , b и c также должна быть нечетной (уменьшение пространства поиска на 75%), а если N имеет четную длину, то только одно из a , b или c может быть четным в длину (25% сокращение пространства поиска).
- гипотеза: если abc кратно 11 , например 407 , то все нечетные повторения a , b и c также будут кратны 11 . Это выходит за рамки вышеуказанной делимости на правило 11 ; на самом деле, среди тех, которые явно разрешены, есть только нечетные повторения. У меня нет доказательств этого, но систематическое тестирование не смогло найти контрпример. Сравните: 444077777 , 44444000777 , 44444440000077777777777 и т. Д. Любой может стесняться доказать или опровергнуть эту гипотезу. С тех пор aditsu продемонстрировала, что это правильно.
Другие формы
2 набора повторяющихся цифр.
Номера вида, который преследовал рандома , a ... ab ... b , кажутся гораздо более редкими. Есть только 7 решений менее 10 1700 , самое большое из которых имеет длину 12 цифр.
4 набора повторяющихся цифр.
Номера этой формы, a ... ab ... bc ... cd ... d , кажутся более плотно распределенными, чем те, которые я искал. Есть 69 решений менее 10 100 , по сравнению с 32 с использованием 3 наборов повторяющихся цифр. Те между 10 11 и 10 100 следующие:
190000007777
700000011119
955666663333
47444444441111
66666622222399
280000000033333
1111333333334999
1111333333377779
1199999999900111
3355555666999999
2222233333000099
55555922222222233333
444444440004449999999
3366666633333333377777
3333333333999888883333
4441111113333333333311111
2222222293333333333333999999
999999999339999999977777777777
22222226666666222222222299999999
333333333333333333339944444444444999999999
559999999999933333333333339999999999999999
3333333333333333333111111111111666666666611111
11111111333330000000000000111111111111111111111
777777777770000000000000000000033333339999999999999999999999999
3333333333333333333333333333333333333333333333336666666977777777777777
666666666666666666611111113333337777777777777777777777777777777777777777
3333333333333333333888889999999999999999999999999999999999999999999999999933333333
Есть простой эвристический аргумент относительно того, почему это должно иметь место. Для каждой цифровой длины существует несколько повторных наборов (т.е. 3 повторных набора или 4 повторных набора и т. Д.), Для которых ожидаемое количество решений будет наибольшим. Переход происходит, когда число дополнительных возможных решений, взятых как отношение, перевешивает вероятность того, что дополнительное число, которое нужно проверить, является простым. Учитывая экспоненциальный характер возможностей проверки и логарифмический характер распределения простых чисел, это происходит относительно быстро.
Например, если мы хотим найти решение из 300 цифр, проверка 4 наборов повторяющихся цифр будет гораздо более вероятной, чем 3 набора, а 5 наборов будут еще более вероятными. Однако, имея в своем распоряжении вычислительную мощность, найти решение, намного превышающее 100 цифр с 4 наборами, было бы за пределами моей емкости, не говоря уже о 5 или 6.
9901444133
(удаление одного 9) не является простым (7 x 1414492019
). Ваш предыдущий пример был верным.