0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Pythonで数列を事前数値計算して浮動小数点数(単精度or倍精度)としてバイナリファイルに保存して使用する方法

Last updated at Posted at 2023-11-08

$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]

参考

↓すでに似たような記事を投稿してたことに気づいた・・

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?