通過置換*3的第一位得到的9個數中,有六個是質數:13,23,43,53,73和83。
通過用同樣的數字置換56**3的第三位和第四位,這個五位數是第一個能夠得到七個質數的數字,
得到的質數是:56003, 56113, 56333, 56443, 56663, 56773, 和 56993。
因此其中最小的56003就是具有這個性質的最小的質數。
找出最小的質數,通過用同樣的數字置換其中的一部分(不一定是相鄰的部分),能夠得到八個質數。
import math
import time
def is_prime(x):
""" x是否質數 """
if x == 1:
return False
if x == 2:
return True
assert math.floor(x) == x and x > 0
x_sqrt = int(math.sqrt(x))
l = [2]
l.extend(range(3, x_sqrt + 1, 2))
for i in l:
if x % i == 0:
return False
return True
def get_digit(x):
""" x各位上的數 """
digit = []
while x:
digit.append(x % 10)
x = x // 10
digit.reverse()
return digit
def get_digit_loc(digit):
""" digit位數可置換方案 """
digit_loc = []
d = [0] * digit
for _ in range(2 ** digit - 2):
add_in = 0
d[0] += 1
for j in range(digit):
d[j] += add_in
if d[j] == 2:
d[j] = 0
add_in = 1
else:
break
digit_loc.append(d.copy())
return digit_loc
t0 = time.time()
num = 11
digit_len = len(str(num))
n = 8
digit_loc = get_digit_loc(digit_len)
while 1:
if is_prime(num):
digit_list = get_digit(num)
for d in digit_loc:
same_digit = set([digit_list[i] for i in range(len(d)) if d[i] == 1])
# 是否爲同一數
if len(same_digit) != 1:
continue
n_ = 1
same_digit_num = same_digit.pop()
d_ = sum([ele * 10 ** (len(d) - 1 - i) for i, ele in enumerate(d)])
for i in range(1, 10):
if same_digit_num + i > 9 or 10 - same_digit_num - i < n - n_:
break
# 相加替換數據
num_ = num + i * d_
if is_prime(num_):
n_ += 1
if n_ == n:
break
if n_ == n:
break
num += 2
if num >= 10 ** digit_len:
digit_len += 1
digit_loc = get_digit_loc(digit_len)
print(num)
t1 = time.time()
print(t1 - t0)