昨日の頭の体操は現在もCore2 Q6600で黙々と処理をしていて、10^617まできましたが、相変わらず12回のパターンはみつかりません。(たぶん、ないのだと思う)
それはさておき concurrent.futures を使用して、複数CPUコアで処理を高速化してみました。他にもちまちまと高速化の工夫を入れました。結果、Core i5-3570K(定格動作)で180桁まで5分かかったのが1分17秒と4倍近く早くなりました。(その過程で、4回のパターンをうまく抽出的できなくなったので誤魔化してあります^^;)
import datetime
import concurrent.futures
keta2 = [2,3,4,5,6,34,35]
def check(n): # 引数の数値が何回かチェックする
k = 1 # ループした回数を保持
t = n # 検査する対象をセット
while True:
u = 1
for i in list(map(int,list(str(t)))) :
u = u * i
if u < 10 :
break
t = u
k += 1
return(k)
def kensho(keta): # その桁数の数値の検証を行う
maxk = 1 # 桁数を保持
maxn = None # 数値を保持
now = datetime.datetime.now()
print("keta: ",keta," / time: ",now-start)
keta789 = keta - 2 #
for s1s2 in ['7'*i+'8'*j+'9'*(keta789-j-i) for i in range(0,keta789+1) for j in range(0,keta789-i+1)] :
for k in keta2: # 23456で構成される数値
s3=str(k)
n = int(s3+s1s2)
r = check(n)
if r > maxk :
maxk = r
maxn = n
# print(keta,maxk,maxn)
return(keta,maxk,maxn)
if __name__ == "__main__":
maxk = 1 # 桁数を保持
maxn = None # 数値を保持
start = datetime.datetime.now()
print('start: ',start)
n = 2
maxlist = {}
while True:
kl = range(n,n+50)
n += 50
with concurrent.futures.ProcessPoolExecutor(max_workers=4) as excuter:
result_list = list(excuter.map(kensho,kl))
# print(result_list)
for k,mk,mn in result_list:
if mk not in maxlist:
maxlist[mk] = mn
elif maxlist[mk] > mn :
maxlist[mk] = mn
print("result")
for i in sorted(maxlist.keys()):
if i>4 : print(i,maxlist[i])
