以前の回答のいくつかは、時間または空間の複雑さO(n)の方法を使用しています。ここで、nは受け入れられる最大の「少数」です。対照的に、次のメソッドは、時間ではO(sqrt(n))、空間ではO(1)です。
正の実数r = x + y
、ここでx=floor(r)
、0 ≤ y < 1
。r
いくつかの形式で近似したいと思いa + √b
ます。その場合、整数オフセットの場合x+y ≈ a+√b
は、、および。bを整数にするには、適格なすべてのの小数部分を最小化します。の適格な値は多くてもあります。次のPythonコードとサンプル出力を参照してください。x+y-a ≈ √b
√b ≈ h+y
h
b ≈ (h+y)^2
(h+y)^2
h
√n
h
import math, random
def findb(y, rhi):
bestb = loerror = 1;
for r in range(2,rhi):
v = (r+y)**2
u = round(v)
err = abs(v-u)
if round(math.sqrt(u))**2 == u: continue
if err < loerror:
bestb, loerror = u, err
return bestb
#random.seed(123456) # set a seed if testing repetitively
f = [math.pi-3] + sorted([random.random() for i in range(24)])
print (' frac sqrt(b) error b')
for frac in f:
b = findb(frac, 12)
r = math.sqrt(b)
t = math.modf(r)[0] # Get fractional part of sqrt(b)
print ('{:9.5f} {:9.5f} {:11.7f} {:5.0f}'.format(frac, r, t-frac, b))
(注1:このコードはデモ形式です。パラメーターfindb()
はy
、、の小数部r
、およびrhi
、最大の少数の平方根です。パラメーターの使用法を変更することをお勧めします。注2:
if round(math.sqrt(u))**2 == u: continue
コードの行findb()
はb
値b=1を除いて、の完全な二乗値を返します。これは、完全な二乗がb = 1によって提供される精度を向上させることができないためです。)
サンプル出力は次のとおりです。途中で約12行が省略されています。最初の出力行は、この手順がb=51
の小数部分を表すことを示していますpi
。これは、他のいくつかの回答で報告されている値と同じです。
frac sqrt(b) error b
0.14159 7.14143 -0.0001642 51
0.11975 4.12311 0.0033593 17
0.12230 4.12311 0.0008085 17
0.22150 9.21954 -0.0019586 85
0.22681 11.22497 -0.0018377 126
0.25946 2.23607 -0.0233893 5
0.30024 5.29150 -0.0087362 28
0.36772 8.36660 -0.0011170 70
0.42452 8.42615 0.0016309 71
...
0.93086 6.92820 -0.0026609 48
0.94677 8.94427 -0.0024960 80
0.96549 11.95826 -0.0072333 143
0.97693 11.95826 -0.0186723 143
プログラムの最後に次のコードを追加すると、以下の出力も表示されます。これは、円周率の小数部分の近似値を示しています。
frac, rhi = math.pi-3, 16
print (' frac sqrt(b) error b bMax')
while rhi < 1000:
b = findb(frac, rhi)
r = math.sqrt(b)
t = math.modf(r)[0] # Get fractional part of sqrt(b)
print ('{:11.7f} {:11.7f} {:13.9f} {:7.0f} {:7.0f}'.format(frac, r, t-frac, b,rhi**2))
rhi = 3*rhi/2
frac sqrt(b) error b bMax
0.1415927 7.1414284 -0.000164225 51 256
0.1415927 7.1414284 -0.000164225 51 576
0.1415927 7.1414284 -0.000164225 51 1296
0.1415927 7.1414284 -0.000164225 51 2916
0.1415927 7.1414284 -0.000164225 51 6561
0.1415927 120.1415831 -0.000009511 14434 14641
0.1415927 120.1415831 -0.000009511 14434 32761
0.1415927 233.1415879 -0.000004772 54355 73441
0.1415927 346.1415895 -0.000003127 119814 164836
0.1415927 572.1415909 -0.000001786 327346 370881
0.1415927 911.1415916 -0.000001023 830179 833569