3

これはちょっと尋ねられましたが、この方法ではありません。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はそれを解決しました、どうもありがとう。

4

2 に答える 2