$i$番目の素数$p_i$に対する$a_i=\sum_{i=1}^n \ln p_i$を事前計算してファイルに保存、使用する例
precalc.py
import mpmath
import struct
from sympy import sieve
mpmath.mp.dps = 30
struct_double = struct.Struct("d") # "f" なら単精度
# 保存先ファイルを開く
dest_f = open("sumlogp","wb")
sumlogp = 0
maxI = 10000000
for i in range(1,maxI+1):
p = sieve[i]
# a_iを計算
sumlogp += mpmath.ln(p)
# append data to file
dest_f.write(struct_double.pack(sumlogp))
# if (i&0xFFFFF) == 0:
# print(i/maxI) # 進捗率表示用
user_side.py
import struct
import mpmath
from sympy import sieve
mpmath.mp.dps = 20
global sumlogp_data
sumlogp_data = open("sumlogp","rb").read()
# return a_i
def sumlogp(i):
# ・単精度なら("d",8)の代わりに("f",4)とする。
# ・i-1 としているのは 添え字iを1始まりで扱いたい場合であり、
# 0始まりなら i-1 ではなく i とする。
t = struct.unpack_from("d",sumlogp_data,8*(i-1))
# struct.unpack_fromはタプルで返るので値を取り出すために[0]を付けている
return t[0]
参考
↓すでに似たような記事を投稿してたことに気づいた・・