Hier meine kleinen UDFs zur Kettenbruchentwicklung:
Zahl in Kettenbruch umwandeln bzw. umrechnen
#include-once
#include <Array.au3>
Func _ZahlInKettenbruch ($iDivident, $iDivisor);Rechnet eine Zahl bzw. einen Bruch (z. B. 17/10) in einen Kettenbruch der Form (1; 1, 2, 3) um.
_EuklidischerAlgorithmus_I ($iDivident, $iDivisor)
_ArrayDelete($aKettenbruch, UBound($aKettenbruch)-1)
For $i = 0 To UBound($aKettenbruch)-(1+2)
$aKettenbruch[$i] = ($aKettenbruch[$i]-$aKettenbruch[$i+2])/$aKettenbruch[$i+1]
Next
_ArrayDelete($aKettenbruch, UBound($aKettenbruch)-1)
ConsoleWrite($iDivident & " / " & $iDivisor & " = " & "(" & StringReplace(_ArrayToString($aKettenbruch, ", "), ",", ";", 1) & ")" & @CRLF)
EndFunc
Kettenbruch in Zahl umwandeln bzw. umrechnen
#include-once
#include <Array.au3>
Func _KettenbruchInZahl ($aKettenbruch);Rechnet einen Kettenbruch der Form (0; 1, 2, 3, 4, 5, 6, 7, 8, 9) (in einem Array, d. h. ohne Semikolon) in eine Zahl bzw. einen Bruch um.
Local $aZahl[2] = [0, 1], $z = 1
For $i = UBound($aKettenbruch)-1 To 0 Step -1
_ArrayAdd($aZahl, "")
$z += 1
$aZahl[$z] = $aKettenbruch[$i] * $aZahl[$z-1] + $aZahl[$z-2]
Next
ConsoleWrite("(" & StringReplace(_ArrayToString($aKettenbruch, ", "), ",", ";", 1) & ") = " & $aZahl[UBound($aZahl)-1] & " / " & $aZahl[UBound($aZahl)-2] & @CRLF)
EndFunc
Hier noch der benötigte Euklidische Algorithmus in zwei Versionen:
Euklidischer Algorithmus -- Version I
Func _EuklidischerAlgorithmus_I ($a, $b);Berechnet den größten gemeinsamen Teiler der beiden Zahlen $a und $b [rekursive Version]
_ArrayAdd($aKettenbruch, "")
$n += 1
If $b = 0 Then
$aKettenbruch[$n] = $a
Return $a
Else
$aKettenbruch[$n] = $a
Return _EuklidischerAlgorithmus_I ($b, Mod($a, $b))
EndIf
EndFunc
Euklidischer Algorithmus -- Version II
Func _EuklidischerAlgorithmus_II ($a, $b);s. o. [iterative Version]
Local $h
While $b <> 0
$h = Mod($a, $b)
$a = $b
$b = $h
WEnd
Return $a
EndFunc
Als globale Variablen werden
[autoit]Global $aKettenbruch[1]
[/autoit]und
[autoit]Global $n = -1
[/autoit]benötigt.