これはちょっと尋ねられましたが、この方法ではありません。n の平方根 (1 <= n <= 10000) の連分数を見つける小さな Python プログラムがあります。
私はジュリアでこれをやろうとしてきましたが、方法がわかりません。主な理由は、無理数を扱うためです (x が完全平方でない場合、sqrt(x) は無理数です。たとえば、sqrt(2) = 1.414213...)。だから私は合理的なクラスを使うことができないと思います。
ここhttps://docs.julialang.org/en/latest/manual/integers-and-floating-point-numbers/#Arbitrary-Precision-Arithmetic-1には、Julia が BigFloats を使用して任意精度の演算を実行できることが記載されています。しかし、それらは十分に正確ではないようです。
また、Python で PyCall と Decimals パッケージ (Julia から) を使用しようとしましたが、奇妙なエラーが発生しました (役立つ場合は投稿できます)。
これが動作する私のPythonプログラムです。私の質問は、ジュリアでこれを行う方法です。
def continuedFractionSquareRoots():
'''
For each number up to 100, get the length of the continued fraction
of the square root for it.
'''
decimal.getcontext().prec = 210 # Need lots of precision for this problem.
continuedFractionLengths = []
for i in range(1, 101):
# For perfect squares, the period is 0
irrationalNumber = decimal.Decimal(i).sqrt()
if irrationalNumber == int(irrationalNumber):
continue
continuedFractionLength = 0
while True:
intPart = irrationalNumber.to_integral_exact(rounding=decimal.ROUND_FLOOR)
if continuedFractionLength == 0:
firstContinuedFractionTimes2 = int(intPart*2)
continuedFractionLength += 1
if intPart == firstContinuedFractionTimes2:
# Have reached the 'period' end for this fraction
break
fractionalPart = irrationalNumber - intPart
irrationalNumber = 1 / fractionalPart
continuedFractionLengths.append(continuedFractionLength)
return continuedFractionLengths
ご覧のとおり、正確な平方根を計算する方法と、数値の整数部分を取得する方法が必要です。そして、それはすべて、非常に多くの精度を除けば、本当にすべてです!
みんな、私は答えのための小さな原稿を持ちたくなかったので、ジュリアコードを投稿しませんでした! しかし、ここにあります。以下のコメントで述べたように、setprecision 関数を使用して精度を高い値に設定したところ、機能しました。経験的に値 711 を得ました。
setprecision(711)
function continuedFractionSquareRoots()
#=
For each number up to 100, get the length of the continued fraction
of the square root for it.
=#
continuedFractionLengths = Int[]
for i=1:100
# For perfect squares, the period is 0
irrationalNumber = BigFloat(sqrt(BigFloat(i)))
if irrationalNumber == floor(irrationalNumber)
continue
end
continuedFractionLength = 0
while true
intPart = floor(irrationalNumber)
if continuedFractionLength == 0
firstContinuedFractionTimes2 = intPart*2
end
continuedFractionLength += 1
if intPart == firstContinuedFractionTimes2
# Have reached the 'period' end for this fraction
break
end
fractionalPart = irrationalNumber - intPart
irrationalNumber = BigFloat(1) / fractionalPart
end
push!(continuedFractionLengths, continuedFractionLength)
end
return continuedFractionLengths
end
とにかく、user2357112はそれを解決しました、どうもありがとう。