昨日の頭の体操は現在も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])