Это как бы спрашивали, но не таким образом. У меня есть небольшая программа на Python, которая находит непрерывные дроби для квадратных корней из n (1 ‹= n ‹= 10000).
Я пытался сделать это в Джулии, и я не понимаю, как это сделать. В основном потому, что он имеет дело с иррациональными числами (sqrt(x) иррационален, если x не является полным квадратом, например, sqrt(2) = 1,414213...). Поэтому я не думаю, что могу использовать рациональный класс.
Здесь написано https://docs.julialang.org/en/latest/manual/integers-and-floating-point-numbers/#Arbitrary-Precision-Arithmetic-1, что Джулия может выполнять арифметические операции с произвольной точностью с помощью BigFloats. Но они кажутся недостаточно точными.
Я также пытался использовать PyCall и пакет Decimals в Python (от Джулии), но получаю странные ошибки (я могу опубликовать их, если они будут полезны).
Вот моя программа 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
Так или иначе, пользователь 2357112 решил это, большое спасибо.