Вы можете решить проблему, не перечисляя все числа до 10 ^ 12, что неэффективно, выполнив рекурсию по длине числа.
Работает следующим образом:
- Простое число длины 1: 2,3,5,7.
- Для всех этих чисел проверьте третье условие, для любой цифры
dn+1∈{1,…,9}
, dn+1dn…d0
не является простым. Для 2 это нормально. Для 3 это не удается (13, например). Сохраните все найденные простые числа в списке L. Сделайте это для всех простых чисел длины 1.
- В L теперь у вас есть все простое число длины 2 с простым числом в качестве первой цифры, поэтому у вас есть все кандидаты на доминантное простое число длины 2
Выполнение этого рекурсивно дает вам все доминирующие простые числа в python:
def test_prime(n):
k = 2
maxk = int(math.sqrt(n))
while k <= maxk:
if n % k == 0:
return False
if k == 2:
k += 1
else:
k += 2
return (n is not 1)
def check_add_digit(number,length):
res = []
for i in range(1,10):
if test_prime( i*10**(length) + number ):
res.append(i*10**(length) + number)
return res
def one_step(list_prime,length):
## Under 10^12
if length > 12:
return None
for prime in list_prime:
res = check_add_digit(prime,length)
if len(res) == 0:
#We have a dominant prime stop
print(prime)
else:
#We do not have a dominant prime but a list of candidates for length +1
one_step(res,length+1)
one_step([2,3,5,7], length=1)
Это работает менее чем за минуту на моей машине.