weiß einer von euch zufällig wie man hohe Zahlen potenzieren kann?
also so im Stil der BigNum.au3...
ich bräuchte des mal^^
ich bin grad schon die ganze zeit am rumprobieren aber ich hab irgendwie keinen erfolg
Padmak
weiß einer von euch zufällig wie man hohe Zahlen potenzieren kann?
also so im Stil der BigNum.au3...
ich bräuchte des mal^^
ich bin grad schon die ganze zeit am rumprobieren aber ich hab irgendwie keinen erfolg
Padmak
Ähm wenns bei der BigNum.au3 geht dann machs doch damit. Kannst die mal Posten?
Ansonsten weiß ichs nicht.
Nein damit gehts nicht^^
damit kann man nur die grundrechenarten rechnen autoit.de/wcf/attachment/3810/ <- hier
ich bräuchte des für Potenzen^^
ich blick grad iwie nicht durch...
Padmak
5³ = 5 * 5 * 5
Dann geht es mit BigNum. Besonders schnell ist es mit dem Trick nicht, aber es könnte reichen.
peethebee
ja moment ich glaub ich habs iwie rausgekriegt
kanns sein dass bei 2^3^33 (ich hab mit nem freund gewettet dass ich es schaff es auszurechnen^^)
633825300114114700748351602688 raukommt?
beim normalen rechnen krieg ich 6.33825300114115e+029
und wenn ichs per
If 633825300114114700748351602688 < 6.33825300114115e+029 Then
MsgBox(0, "", "1")
Else
MsgBox(0, "", "2")
EndIf
vergleich kommt die MsgBox mit 1...
Gerechnet hab ichs per
Global $hoch = 1
$hochanfang = 8
$hoch = _BigNum_Mul($hoch, $hochanfang)
$hoch = _BigNum_Mul($hoch, $hochanfang)
$hoch = _BigNum_Mul($hoch, $hochanfang)
$hoch = _BigNum_Mul($hoch, $hochanfang)
$hoch = _BigNum_Mul($hoch, $hochanfang)
$hoch = _BigNum_Mul($hoch, $hochanfang)
$hoch = _BigNum_Mul($hoch, $hochanfang)
$hoch = _BigNum_Mul($hoch, $hochanfang)
$hoch = _BigNum_Mul($hoch, $hochanfang)
$hoch = _BigNum_Mul($hoch, $hochanfang)
$hoch = _BigNum_Mul($hoch, $hochanfang)
$hoch = _BigNum_Mul($hoch, $hochanfang)
$hoch = _BigNum_Mul($hoch, $hochanfang)
$hoch = _BigNum_Mul($hoch, $hochanfang)
$hoch = _BigNum_Mul($hoch, $hochanfang)
$hoch = _BigNum_Mul($hoch, $hochanfang)
$hoch = _BigNum_Mul($hoch, $hochanfang)
$hoch = _BigNum_Mul($hoch, $hochanfang)
$hoch = _BigNum_Mul($hoch, $hochanfang)
$hoch = _BigNum_Mul($hoch, $hochanfang)
$hoch = _BigNum_Mul($hoch, $hochanfang)
$hoch = _BigNum_Mul($hoch, $hochanfang)
$hoch = _BigNum_Mul($hoch, $hochanfang)
$hoch = _BigNum_Mul($hoch, $hochanfang)
$hoch = _BigNum_Mul($hoch, $hochanfang)
$hoch = _BigNum_Mul($hoch, $hochanfang)
$hoch = _BigNum_Mul($hoch, $hochanfang)
$hoch = _BigNum_Mul($hoch, $hochanfang)
$hoch = _BigNum_Mul($hoch, $hochanfang)
$hoch = _BigNum_Mul($hoch, $hochanfang)
$hoch = _BigNum_Mul($hoch, $hochanfang)
$hoch = _BigNum_Mul($hoch, $hochanfang)
$hoch = _BigNum_Mul($hoch, $hochanfang)
Padmak
Man müsste eine _BigNum_Potenz Funktion machen können. Ich versuchs gleich mal.
ich auch^^
mir geht nur grad der theoretische ansatz ab^^
wenn ichs per *= mach bekomm ich 0 zurück-.-
Padmak
Juhu ich habs. Also mit 500 hoch 500 gings^^ War garnicht so schwer^^ Nur bisschen logisch denken. Geht halt nur 1 Faktor bis jetzt.
hm bei mir hats net gehauen
ich schau mir grad die funktion an^^
Padmak
So klappts auch mit Faktor 1^^:
Global Const $BigNum_Debug=False
[/autoit] [autoit][/autoit] [autoit]Func _BigNum_Potenz($sX,$sFaktor)
If $sFaktor = 1 Then Return $sX
$Return = _BigNum_Mul($sX,$sX)
For $i = 1 To $sFaktor -2
$Return = _BigNum_Mul($Return,$sX)
Next
Return $Return
EndFunc
MsgBox(0,"",_BigNum_Potenz(5,3)) ; Beispiel
; #INDEX# =======================================================================================================================
; Title .........: BigNum
; AutoIt Version : 3.2.12.1
; Language ......: English
; Description ...: Perform calculations with big numbers
; ===============================================================================================================================
; #CURRENT# =====================================================================================================================
;_BigNum_Add
;_BigNum_Sub
;_BigNum_Mul
;_BigNum_Div
;_BigNum_Mod
;_BigNum_Round
;_BigNum_Compare
;_BigNum_Swap
; ===============================================================================================================================
; #INTERNAL_USE_ONLY#============================================================================================================
;_BigNum_CheckNegative
;_BigNum_DivAdd
;_BigNum_DivComp
;_BigNum_DivSub
;_BigNum_Div_DivisorGreater14
;_BigNum_Div_DivisorMaxLen14
;_BigNum_InsertDecimalSeparator
;_BigNum_StringIsDecimal
;_BigNum_IsValid
; ===============================================================================================================================
; #FUNCTION# ;====================================================================================
;
; Name...........: _BigNum_Add
; Description ...: Addition $sX + $sY
; Syntax.........: _BigNum_Add($sX, $sY)
; Parameters ....: $sX - StringNumber: Minus"-" Digits"0"..."9" Separator"." ("-1234567890.12345")
; $sY - StringNumber: Minus"-" Digits"0"..."9" Separator"." ("-1234567890.12345")
; Return values .: Success - Result $sX + $sY
; Failure - 0, sets @error to 1 if $sX/$sY not valid StringNumber
; Author ........: Eukalyptus http://www.autoit.de
;
; ;===============================================================================================
Func _BigNum_Add($sX, $sY)
If _BigNum_IsValid($sX, $sY) Then Return SetError(1, 0, 0)
Local $iNeg = _BigNum_CheckNegative($sX, $sY), $sNeg = ""
If $iNeg = 3 Then $sNeg = "-"
If $iNeg = 1 Then Return _BigNum_Sub($sY, $sX)
If $iNeg = 2 Then Return _BigNum_Sub($sX, $sY)
If $BigNum_Debug Then Local $BN_File=FileOpen(@ScriptDir & "\BigNum_Debug.txt",2)
Local $iDec = _BigNum_StringIsDecimal($sX, $sY)
Local $iTmp = StringLen($sX), $iLen = StringLen($sY), $iCar = 0, $sRet = ""
If $BigNum_Debug Then FileWrite($BN_File," " & _BigNum_DS($iLen-$iTmp,"0") & $sX & " + " & @CRLF & " " & _BigNum_DS($iTmp-$iLen,"0") & $sY & @CRLF)
If $iLen < $iTmp Then $iLen = $iTmp
If $BigNum_Debug Then FileWrite($BN_File," " & _BigNum_DS($iLen,"-") & @CRLF)
For $i = 1 To $iLen Step 18
$iTmp = Int(StringRight($sX, 18)) + Int(StringRight($sY, 18)) + $iCar
$sX = StringTrimRight($sX, 18)
$sY = StringTrimRight($sY, 18)
If ($iTmp > 999999999999999999) Then
$iTmp = StringRight($iTmp, 18)
$sRet = $iTmp & $sRet
If $BigNum_Debug Then FileWrite($BN_File,_BigNum_DS($iLen-$i-StringLen($iTmp)+2) & $iTmp & _BigNum_DS($i) & "+" & $iCar & @CRLF)
$iCar = 1
Else
If $BigNum_Debug Then FileWrite($BN_File,_BigNum_DS($iLen-$i-StringLen($iTmp)+2) & $iTmp & _BigNum_DS($i) & "+" & $iCar & @CRLF)
$iTmp = StringRight("000000000000000000" & $iTmp, 18)
$sRet = $iTmp & $sRet
$iCar = 0
EndIf
Next
$sRet = StringRegExpReplace($iCar & $sRet, "^0+([^0]|0$)", "\1", 1)
If $iDec > 0 Then $sRet = _BigNum_InsertDecimalSeparator($sRet, $iDec, $iDec)
If $sRet = "0" Then $sNeg = ""
If $BigNum_Debug Then
FileWrite($BN_File," " & _BigNum_DS($iLen,"-") & @CRLF)
FileWrite($BN_File,_BigNum_DS($iLen - StringLen($sRet)+1) & $sRet)
FileClose($BN_File)
EndIf
Return $sNeg & $sRet
EndFunc ;==>_BigNum_Add
; #FUNCTION# ;====================================================================================
;
; Name...........: _BigNum_Sub
; Description ...: Subtraction $sX - $sY
; Syntax.........: _BigNum_Sub($sX, $sY)
; Parameters ....: $sX - StringNumber: Minus"-" Digits"0"..."9" Separator"." ("-1234567890.12345")
; $sY - StringNumber: Minus"-" Digits"0"..."9" Separator"." ("-1234567890.12345")
; Return values .: Success - Result $sX - $sY
; Failure - 0, sets @error to 1 if $sX/$sY not valid StringNumber
; Author ........: Eukalyptus http://www.autoit.de
;
; ;===============================================================================================
Func _BigNum_Sub($sX, $sY)
If _BigNum_IsValid($sX, $sY) Then Return SetError(1, 0, 0)
Local $iNeg = _BigNum_CheckNegative($sX, $sY), $bNeg = False
If $iNeg = 3 Then Return _BigNum_Add("-" & $sX, $sY)
If $iNeg = 1 Then Return "-" & _BigNum_Add($sX, $sY)
If $iNeg = 2 Then Return _BigNum_Add($sX, $sY)
If $BigNum_Debug Then Local $BN_File=FileOpen(@ScriptDir & "\BigNum_Debug.txt",2)
Local $iDec = _BigNum_StringIsDecimal($sX, $sY)
If _BigNum_Compare($sX, $sY) = -1 Then $bNeg = _BigNum_Swap($sX, $sY)
Local $iTmp = StringLen($sX), $iLen = StringLen($sY), $iCar = 0, $sRet = ""
If $BigNum_Debug Then FileWrite($BN_File," " & _BigNum_DS($iLen-$iTmp,"0") & $sX & " - " & @CRLF & " " & _BigNum_DS($iTmp-$iLen,"0") & $sY & @CRLF)
If $iLen < $iTmp Then $iLen = $iTmp
If $BigNum_Debug Then FileWrite($BN_File," " & _BigNum_DS($iLen,"-") & @CRLF)
For $i = 1 To $iLen Step 18
$iTmp = Int(StringRight($sX, 18)) - Int(StringRight($sY, 18)) - $iCar
$sX = StringTrimRight($sX, 18)
$sY = StringTrimRight($sY, 18)
If $iTmp < 0 Then
$iTmp = 1000000000000000000 + $iTmp
If $BigNum_Debug Then FileWrite($BN_File,_BigNum_DS($iLen-$i-StringLen($iTmp)+2) & $iTmp & _BigNum_DS($i) & "-" & $iCar & @CRLF)
$iCar = 1
Else
If $BigNum_Debug Then FileWrite($BN_File,_BigNum_DS($iLen-$i-StringLen($iTmp)+2) & $iTmp & _BigNum_DS($i) & "-" & $iCar & @CRLF)
$iCar = 0
EndIf
$sRet = StringRight("0000000000000000000" & $iTmp, 18) & $sRet
Next
$sRet = StringRegExpReplace($iCar & $sRet, "^0+([^0]|0$)", "\1", 1)
If $iDec > 0 Then $sRet = _BigNum_InsertDecimalSeparator($sRet, $iDec, $iDec)
If $BigNum_Debug Then
FileWrite($BN_File," " & _BigNum_DS($iLen,"-") & @CRLF)
FileWrite($BN_File,_BigNum_DS($iLen - StringLen($sRet)+1) & $sRet)
FileClose($BN_File)
EndIf
If $bNeg = True And $sRet <> "0" Then
Return "-" & $sRet
Else
Return $sRet
EndIf
EndFunc ;==>_BigNum_Sub
; #FUNCTION# ;====================================================================================
;
; Name...........: _BigNum_Mul
; Description ...: Multiplication $sX * $sY
; Syntax.........: _BigNum_Mul($sX, $sY)
; Parameters ....: $sX - StringNumber: Minus"-" Digits"0"..."9" Separator"." ("-1234567890.12345")
; $sY - StringNumber: Minus"-" Digits"0"..."9" Separator"." ("-1234567890.12345")
; Return values .: Success - Result $sX * $sY
; Failure - 0, sets @error to 1 if $sX/$sY not valid StringNumber
; Author ........: Eukalyptus http://www.autoit.de
;
; ;===============================================================================================
Func _BigNum_Mul($sX, $sY)
If _BigNum_IsValid($sX, $sY) Then Return SetError(1, 0, 0)
Local $iNeg = _BigNum_CheckNegative($sX, $sY), $sNeg = ""
Local $iDec = _BigNum_StringIsDecimal($sX, $sY)
If $BigNum_Debug Then
Local $BN_File=FileOpen(@ScriptDir & "\BigNum_Debug.txt",2), $BN_X=StringLen($sX)
FileWrite($BN_File," " & $sX & " * " & $sY & " = " & @CRLF)
FileWrite($BN_File," " & _BigNum_DS($BN_X+StringLen($sY)+3,"-") & @CRLF)
EndIf
Local $aX = StringRegExp($sX, '\A.{' & 6 - (Ceiling(StringLen($sX) / 6) * 6 - StringLen($sX)) & '}|.{6}+', 3)
Local $aY = StringRegExp($sY, '\A.{' & 6 - (Ceiling(StringLen($sY) / 6) * 6 - StringLen($sY)) & '}|.{6}+', 3)
Local $aRet[UBound($aX) + UBound($aY) - 1]
For $j = 0 To UBound($aX) - 1
For $i = 0 To UBound($aY) - 1
If $BigNum_Debug Then
FileWrite($BN_File," " & _BigNum_DS(StringLen($aX[0])+$j*6-StringLen($aX[$j])) & $aX[$j] & _BigNum_DS($BN_X-(StringLen($aX[0])+$j*6)) & " * " & _BigNum_DS(StringLen($aY[0])+$i*6-StringLen($aY[$i])) & $aY[$i])
FileWrite($BN_File," " & _BigNum_DS(((UBound($aY)-1-$i)*6)+($i*15+$j*15)) & $aX[$j] * $aY[$i] & @CRLF)
EndIf
$aRet[$j + $i] += $aX[$j] * $aY[$i]
Next
Next
If $BigNum_Debug Then
FileWrite($BN_File," " & _BigNum_DS($BN_X+StringLen($sY)+3) & _BigNum_DS($i*15+$j*15,"-") & @CRLF)
FileWrite($BN_File," " & _BigNum_DS($BN_X+StringLen($sY)+6))
For $i=0 to UBound($aRet)-1
FileWrite($BN_File, $aRet[$i] & _BigNum_DS(15-StringLen($aRet[$i])))
Next
FileWrite($BN_File,@CRLF & @CRLF)
For $i=0 to UBound($aRet)-1
FileWrite($BN_File,_BigNum_DS($BN_X+StringLen($sY)) & _BigNum_DS($i*6+15-StringLen($aRet[$i])) & $aRet[$i] & @CRLF)
Next
FileWrite($BN_File,_BigNum_DS($BN_X+StringLen($sY)) & _BigNum_DS(15-StringLen($aRet[0])) & _BigNum_DS($i*6,"-") & @CRLF)
EndIf
Local $sRet = "", $iCar = 0, $iTmp
For $i = UBound($aRet) - 1 To 0 Step -1
$aRet[$i] += $iCar
$iCar = Floor($aRet[$i] / 1000000)
$iTmp = Mod($aRet[$i], 1000000)
If $iTmp <= 1000000 Then $iTmp = StringRight("000000" & $iTmp, 6)
$sRet = $iTmp & $sRet
Next
If $iCar > 0 Then $sRet = $iCar & $sRet
$sRet = StringRegExpReplace($sRet, "^0+([^0]|0$)", "\1", 1)
If ($iNeg = 1 Or $iNeg = 2) And $sRet <> "0" Then $sNeg = "-"
If $iDec > 0 Then $sRet = _BigNum_InsertDecimalSeparator($sRet, $iDec * 2, $iDec * 2)
If $BigNum_Debug Then
FileWrite($BN_File,_BigNum_DS($BN_X+StringLen($sY)) & _BigNum_DS(15-StringLen($aRet[0])) & $sRet)
FileClose($BN_File)
EndIf
Return $sNeg & $sRet
EndFunc ;==>_BigNum_Mul
; #FUNCTION# ;====================================================================================
;
; Name...........: _BigNum_Div
; Description ...: Division $sX / $sY
; Syntax.........: _BigNum_Div($sX, $sY, [$iD = 0])
; Parameters ....: $sX - StringNumber: Minus"-" Digits"0"..."9" Separator"." ("-1234567890.12345")
; $sY - StringNumber: Minus"-" Digits"0"..."9" Separator"." ("-1234567890.12345")
; $iD [optional] - Number of Decimalplaces
; Return values .: Success - Result $sX / $sY
; Failure - 0, sets @error to 1 if $sX/$sY not valid StringNumber
; Author ........: Eukalyptus http://www.autoit.de
;
; ;===============================================================================================
Func _BigNum_Div($sX, $sY, $iD = 0)
If _BigNum_IsValid($sX, $sY) Then Return SetError(1, 0, 0)
Local $iNeg = _BigNum_CheckNegative($sX, $sY), $sNeg = ""
Local $iDec = _BigNum_StringIsDecimal($sX, $sY), $sMod
If $sX = 0 Or $sY = 0 Then Return "0"
If $sY = "1" Then Return $sNeg & $sX
While StringLeft($sX,1)="0"
$sX=StringTrimLeft($sX,1)
$iDec+=1
WEnd
While StringLeft($sY,1)="0"
$sY=StringTrimLeft($sY,1)
$iDec+=1
WEnd
Local $sRet = "", $iLnX = StringLen($sX), $iLnY = StringLen($sY), $iTmp, $iCnt, $sTmp, $iDe1 = 0
If $iD > 0 Then $iDe1 += $iD
If $iNeg = 1 Or $iNeg = 2 Then $sNeg = "-"
$iTmp = _BigNum_Compare($sX, $sY)
If $iTmp = -1 Then
For $iCnt = $iLnX To $iLnY
$sX &= 0
$iDe1 += 1
Next
EndIf
If $iTmp = 0 Then Return $sNeg & "1"
If $iD = -1 Then $iD = $iDec * 2
For $iCnt = 1 To $iD
$sX &= "0"
Next
If $iLnY > 14 Then
$sRet = _BigNum_Div_DivisorGreater14($sX, $sY, $sMod)
Else
$sRet = _BigNum_Div_DivisorMaxLen14($sX, $sY, $sMod)
EndIf
If $iDe1 > 0 Then $sRet = _BigNum_InsertDecimalSeparator($sRet, $iDe1, $iD)
If $sRet = "0" Then
Return "0"
Else
Return $sNeg & $sRet
EndIf
EndFunc ;==>_BigNum_Div
; #FUNCTION# ;====================================================================================
;
; Name...........: _BigNum_Mod
; Description ...: Modulo Mod($sX, $sY)
; Syntax.........: _BigNum_Mod($sX, $sY)
; Parameters ....: $sX - StringNumber: Minus"-" Digits"0"..."9" Separator"." ("-1234567890.12345")
; $sY - StringNumber: Minus"-" Digits"0"..."9" Separator"." ("-1234567890.12345")
; Return values .: Success - Result Mod($sX, $sY)
; Failure - 0, sets @error to 1 if $sX/$sY not valid StringNumber
; Author ........: Eukalyptus http://www.autoit.de
;
; ;===============================================================================================
Func _BigNum_Mod($sX, $sY)
If _BigNum_IsValid($sX, $sY) Then Return SetError(1, 0, 0)
If $sY = 0 Or $sY = 1 Then Return "0"
Local $sRes = $sX
Local $iNeg = _BigNum_CheckNegative($sX, $sY)
Local $iDec = _BigNum_StringIsDecimal($sX, $sY)
If _BigNum_Compare($sX, $sY) < 0 Then Return $sRes
Local $sRet = "", $iLnX = StringLen($sX), $iLnY = StringLen($sY)
If $iLnY > 14 Then
_BigNum_Div_DivisorGreater14($sX, $sY, $sRet)
Else
_BigNum_Div_DivisorMaxLen14($sX, $sY, $sRet)
EndIf
$sRet = _BigNum_InsertDecimalSeparator($sRet, $iDec, StringLen($sRet))
If ($iNeg = 3 Or $iNeg = 1) And $sRet <> "0" Then $sRet = "-" & $sRet
Return $sRet
EndFunc ;==>_BigNum_Mod
; #FUNCTION# ;====================================================================================
;
; Name...........: _BigNum_Round
; Description ...: Round $sX to $iD Decimalplaces
; Syntax.........: _BigNum_Round($sX, $iD)
; Parameters ....: $sX - StringNumber: Minus"-" Digits"0"..."9" Separator"." ("-1234567890.12345")
; $iD - Number of Decimalplaces
; Return values .: Success - Result Round($sX, $iD)
; Failure - 0, sets @error to 1 if $sX not valid StringNumber
; Author ........: Eukalyptus http://www.autoit.de
;
; ;===============================================================================================
Func _BigNum_Round($sX, $iD)
If _BigNum_IsValid($sX, $sX) Then Return SetError(1, 0, 0)
Local $sTmp = 0, $sRet, $sRes = $sX
Local $iNeg = _BigNum_CheckNegative($sX, $sTmp)
Local $iDec = _BigNum_StringIsDecimal($sX, $sTmp)
If $iD > $iDec Or $iDec = 0 Then Return $sRes
$sTmp = StringLeft(StringRight($sX, $iDec - $iD), 1)
$sRet = StringTrimRight($sRes, $iDec - $iD)
If $sTmp >= 5 And $iD > 0 Then
If $iNeg = 1 Then
$sRet = _BigNum_Add($sRet, "-0." & StringFormat("%0" & String($iD) & "u", "1"))
Else
$sRet = _BigNum_Add($sRet, "0." & StringFormat("%0" & String($iD) & "u", "1"))
EndIf
ElseIf $sTmp >= 5 And $iD = 0 Then
If $iNeg = 1 Then
$sRet = _BigNum_Add($sRet, "-1")
Else
$sRet = _BigNum_Add($sRet, "1")
EndIf
Else
If StringRight($sRet, 1) = "." Then $sRet = StringTrimRight($sRet, 1)
EndIf
Return $sRet
EndFunc ;==>_BigNum_Round
; #FUNCTION# ;====================================================================================
;
; Name...........: _BigNum_Compare
; Description ...: Compares $sX $sY
; Syntax.........: _BigNum_Compare($sX, $sY)
; Parameters ....: $sX - StringNumber: Minus"-" Digits"0"..."9" Separator"." ("-1234567890.12345")
; $sY - StringNumber: Minus"-" Digits"0"..."9" Separator"." ("-1234567890.12345")
; Return values .: Success - Return:
; |0 - $sX and $sY are equal
; |1 - $sX is greater than $sY
; |-1 - $sX is less than $sY
; Failure - sets @error to 1 if $sX/$sY not valid StringNumber
; Author ........: Eukalyptus http://www.autoit.de
;
; ;===============================================================================================
Func _BigNum_Compare($sX, $sY)
Local $iNeg = _BigNum_CheckNegative($sX, $sY)
If $iNeg = 1 Then Return -1
If $iNeg = 2 Then Return 1
Local $iLnX = StringLen($sX), $iLnY = StringLen($sY)
If $iNeg = 3 Then
If $iLnX > $iLnY Then
Return -1
ElseIf $iLnX < $iLnY Then
Return 1
Else
If $sX > $sY Then
Return -1
ElseIf $sX < $sY Then
Return 1
Else
Return 0
EndIf
EndIf
Else
If $iLnX > $iLnY Then
Return 1
ElseIf $iLnX < $iLnY Then
Return -1
Else
If $sX > $sY Then
Return 1
ElseIf $sX < $sY Then
Return -1
Else
Return 0
EndIf
EndIf
EndIf
EndFunc ;==>_BigNum_Compare
Func _BigNum_Swap(ByRef $sX, ByRef $sY)
Local $sSwap = $sX
$sX = $sY
$sY = $sSwap
Return True
EndFunc ;==>_BigNum_Swap
; #INTERNAL_USE_ONLY#============================================================================================================
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]#region Internal Functions
Func _BigNum_Div_DivisorGreater14($sX, $sY, ByRef $sM)
$sM="0"
If $sY="1" Then Return $sX
If $sX = "0" Or $sY = "0" Or $sX = "" Or $sY = "" Then Return "0"
If $BigNum_Debug Then
Local $BN_File=FileOpen(@ScriptDir & "\BigNum_Debug.txt",2), $BN_X=StringLen($sX)
FileWrite($BN_File," " & $sX & " / " & $sY & " = " & @CRLF)
FileWrite($BN_File," " & _BigNum_DS($BN_X+StringLen($sY)+3,"-") & @CRLF)
EndIf
Local $iLnY = StringLen($sY), $bRed = False
Local $sRet = "", $sRem = StringLeft($sX, $iLnY), $sTmp = "", $sTm2 = "", $iCnt, $iLen = 1
$sX = StringTrimLeft($sX, $iLnY)
Do
If _BigNum_DivComp($sRem, $sY) = -1 Then
$sTmp = StringLeft($sX, 1)
$sRem &= $sTmp
$sX = StringTrimLeft($sX, 1)
If StringLen($sTmp) > 0 Then $iLen += 1
EndIf
$sTmp = $sY
$sTm2 = "0"
If _BigNum_DivComp($sRem, $sY) >= 0 Then
For $iCnt = 1 To 9
$sTm2 = $sTmp
$sTmp = _BigNum_DivAdd($sTmp, $sY)
If _BigNum_DivComp($sRem, $sTmp) < 0 Then ExitLoop
Next
Else
$iCnt = 0
EndIf
If $BigNum_Debug Then FileWrite($BN_File,_BigNum_DS($BN_X - StringLen($sX)-StringLen($sRem)+1) & $sRem & _BigNum_DS($BN_X+10-$iLen-$iLnY) & StringFormat("%0" & String($iLen) & "u", $iCnt) & @CRLF)
If StringLen($sX) = 0 Then $bRed = True
$sM = $sRem
$sRem = _BigNum_DivSub($sRem, $sTm2)
If $iCnt > 0 Then $sM = $sRem
$sRet &= StringFormat("%0" & String($iLen) & "u", $iCnt)
$iTrm = $iLnY - StringLen($sRem)
$sTmp = StringLeft($sX, $iTrm)
$sX = StringTrimLeft($sX, $iTrm)
$iLen = StringLen($sTmp)
$sRem &= $sTmp
Until $bRed
$sM = StringRegExpReplace($sM, "^0+([^0]|0$)", "\1", 1)
If $BigNum_Debug Then
FileWrite($BN_File," " & _BigNum_DS($BN_X+9+StringRegExp($sRet, "^0+([^0]|0$)", "\1", 1)) & _BigNum_DS(StringLen(StringRegExpReplace($sRet, "^0+([^0]|0$)", "\1", 1)),"-") & @CRLF)
FileWrite($BN_File," " & _BigNum_DS($BN_X+9+StringRegExp($sRet, "^0+([^0]|0$)", "\1", 1)) & StringRegExpReplace($sRet, "^0+([^0]|0$)", "\1", 1))
FileClose($BN_File)
EndIf
Return StringRegExpReplace($sRet, "^0+([^0]|0$)", "\1", 1)
EndFunc ;==>_BigNum_Div_DivisorGreater14
Func _BigNum_Div_DivisorMaxLen14($sX, $sY, ByRef $sM)
$sM="0"
If $sY="1" Then Return $sX
If $sX = "0" Or $sY = "0" Or $sX = "" Or $sY = "" Then Return "0"
If $BigNum_Debug Then
Local $BN_File=FileOpen(@ScriptDir & "\BigNum_Debug.txt",2), $BN_X=StringLen($sX)
FileWrite($BN_File," " & $sX & " / " & $sY & " = " & @CRLF)
FileWrite($BN_File," " & _BigNum_DS($BN_X+StringLen($sY)+3,"-") & @CRLF)
EndIf
Local $sRet = "", $iRem = StringLeft($sX, 15), $iTmp = 0, $iTrm = 6, $iLen
$sX = StringTrimLeft($sX, 15)
$iTmp = Floor($iRem / $sY)
$sRet &= $iTmp
If $BigNum_Debug Then FileWrite($BN_File," " & $iRem & _BigNum_DS(StringLen($sX)+10) & $iTmp & @CRLF)
$iRem -= $iTmp * $sY
While StringLen($sX) > 0
$iTrm = 15 - StringLen($iRem)
$iTmp = StringLeft($sX, $iTrm)
$iLen = StringLen($iTmp)
$iRem &= $iTmp
$sX = StringTrimLeft($sX, $iTrm)
$iTmp = Floor($iRem / $sY)
$iTmp = StringRight("000000000000000" & $iTmp, $iLen)
If $BigNum_Debug Then FileWrite($BN_File,_BigNum_DS($BN_X-StringLen($sX)+1-stringlen($iRem)) & $iRem & _BigNum_DS(StringLen($sX)+10+StringLen($sRet)) & $iTmp & @CRLF)
$sRet &= $iTmp
$iRem -= $iTmp * $sY
WEnd
$sM = String($iRem)
If $BigNum_Debug Then
FileWrite($BN_File," " & _BigNum_DS($BN_X+10) & _BigNum_DS(StringLen(StringRegExpReplace($sRet, "^0+([^0]|0$)", "\1", 1)),"-") & @CRLF)
FileWrite($BN_File," " & _BigNum_DS($BN_X+10) & StringRegExpReplace($sRet, "^0+([^0]|0$)", "\1", 1))
FileClose($BN_File)
EndIf
Return StringRegExpReplace($sRet, "^0+([^0]|0$)", "\1", 1)
EndFunc ;==>_BigNum_Div_DivisorMaxLen14
Func _BigNum_DivComp($sX, $sY)
$sX = StringRegExpReplace($sX, "^0+([^0]|0$)", "\1", 1)
$sY = StringRegExpReplace($sY, "^0+([^0]|0$)", "\1", 1)
Local $iLnX = StringLen($sX), $iLnY = StringLen($sY)
If $iLnX < $iLnY Then
Return -1
ElseIf $iLnX > $iLnY Then
Return 1
Else
If $sX < $sY Then
Return -1
ElseIf $sX > $sY Then
Return 1
Else
Return 0
EndIf
EndIf
EndFunc ;==>_BigNum_DivComp
Func _BigNum_DivAdd($sX, $sY)
Local $iTmp = StringLen($sX), $iLen = StringLen($sY), $iCar = 0, $sRet = ""
If $iLen < $iTmp Then $iLen = $iTmp
For $i = 1 To $iLen Step 18
$iTmp = Int(StringRight($sX, 18)) + Int(StringRight($sY, 18)) + $iCar
$sX = StringTrimRight($sX, 18)
$sY = StringTrimRight($sY, 18)
If ($iTmp > 999999999999999999) Then
$sRet = StringRight($iTmp, 18) & $sRet
$iCar = 1
Else
$iTmp = StringRight("000000000000000000" & $iTmp, 18)
$sRet = $iTmp & $sRet
$iCar = 0
EndIf
Next
$sRet = StringRegExpReplace($iCar & $sRet, "^0+([^0]|0$)", "\1", 1)
Return $sRet
EndFunc ;==>_BigNum_DivAdd
Func _BigNum_DivSub($sX, $sY)
Local $iTmp = StringLen($sX), $iLen = StringLen($sY), $iCar = 0, $sRet = ""
If $iLen < $iTmp Then $iLen = $iTmp
For $i = 1 To $iLen Step 18
$iTmp = Int(StringRight($sX, 18)) - Int(StringRight($sY, 18)) - $iCar
$sX = StringTrimRight($sX, 18)
$sY = StringTrimRight($sY, 18)
If $iTmp < 0 Then
$iTmp = 1000000000000000000 + $iTmp
$iCar = 1
Else
$iCar = 0
EndIf
$sRet = StringRight("0000000000000000000" & $iTmp, 18) & $sRet
Next
$sRet = StringRegExpReplace($iCar & $sRet, "^0+([^0]|0$)", "\1", 1)
Return $sRet
EndFunc ;==>_BigNum_DivSub
Func _BigNum_IsValid($sX, $sY)
If StringRegExp($sX, "[^0-9.-]") <> 0 Or StringRegExp($sY, "[^0-9.-]") <> 0 Then Return True
Return False
EndFunc ;==>_BigNum_IsValid
Func _BigNum_InsertDecimalSeparator($sX, $iDec, $iD = 18)
If $iD = 0 And $iDec = 0 Then Return $sX
Local $sRet = StringRegExpReplace(StringRight(StringFormat("%0" & String($iDec) & "u", "") & $sX, $iDec), "0+$", "\1", 1)
$sX = StringTrimRight($sX, $iDec)
If $sX = "" Then $sX = "0"
$sRet = StringLeft($sRet, $iD)
If $sRet = "" Or $sRet = "0" Then Return $sX
Return $sX & "." & $sRet
EndFunc ;==>_BigNum_InsertDecimalSeparator
Func _BigNum_StringIsDecimal(ByRef $sX, ByRef $sY)
If StringLeft($sX, 1) = "." Then $sX = "0" & $sX
If StringLeft($sY, 1) = "." Then $sY = "0" & $sY
Local $iPsX = StringInStr($sX, ".", 0, 1) - 1, $iPsY = StringInStr($sY, ".", 0, 1) - 1
$sX = StringRegExpReplace($sX, "\D", "")
$sY = StringRegExpReplace($sY, "\D", "")
Local $iLnX = StringLen($sX), $iLnY = StringLen($sY)
If $iPsX <= 0 Then $iPsX = $iLnX
If $iPsY <= 0 Then $iPsY = $iLnY
If $iLnX - $iPsX > $iLnY - $iPsY Then
For $iCnt = $iLnY - $iPsY To $iLnX - $iPsX - 1
$sY &= "0"
Next
Return $iLnX - $iPsX
ElseIf $iLnX - $iPsX < $iLnY - $iPsY Then
For $iCnt = $iLnX - $iPsX To $iLnY - $iPsY - 1
$sX &= "0"
Next
Return $iLnY - $iPsY
EndIf
Return $iLnX - $iPsX
EndFunc ;==>_BigNum_StringIsDecimal
Func _BigNum_CheckNegative(ByRef $sX, ByRef $sY)
Local $bNgX = False, $bNgY = False
While StringLeft($sX, 1) = "-"
$bNgX = Not $bNgX
$sX = StringTrimLeft($sX, 1)
WEnd
While StringLeft($sY, 1) = "-"
$bNgY = Not $bNgY
$sY = StringTrimLeft($sY, 1)
WEnd
$sX = StringRegExpReplace($sX, "^0+([^0]|0$)", "\1", 1)
$sY = StringRegExpReplace($sY, "^0+([^0]|0$)", "\1", 1)
If $sX = "" Then $sX = "0"
If $sY = "" Then $sY = "0"
If $bNgX = True And $bNgY = True Then
Return 3
ElseIf $bNgX = True And $bNgY = False Then
Return 1
ElseIf $bNgX = False And $bNgY = True Then
Return 2
Else
Return 0
EndIf
EndFunc ;==>_BigNum_CheckNegative
Func _BigNum_DS($iC, $sS=" ")
Local $sRet="", $iCnt
For $iCnt=1 To $iC
$sRet&=$sS
Next
Return $sRet
EndFunc
#endregion Internal Functions
ich hab grad gehirnblockade
meinst du ob man des auch auf mehrere faktoren auslegen könnte?
Padmak
Ich versuchs mal
EDIT: Sorry ich muss ins Bett^^^xD morgen dann
ok ich versuch mich mal dran^^
gute nacht
Padmak
meinst du ob man des auch auf mehrere faktoren auslegen könnte?
Es gibt da eine ganz einfache mathematische Regel...
[Blockierte Grafik: http://upload.wikimedia.org/math/5/f/d/5fd9e08ea951cbaafa00208f20528dd8.png]
Zitat von Padmakkanns sein dass bei 2^3^33 (ich hab mit nem freund gewettet dass ich es schaff es auszurechnen^^)
633825300114114700748351602688 raukommt?
Ja
MsgBox(0,"",_BigNum_Potenz(_BigNum_Potenz(2,3),33)) ; Beispiel
[/autoit]Is übrigens dasselbe ...
ich hab grad keinen nerv für nix^^
aber dankeschön^^
ich schaus mir morgen an
juhuuu 5 euro mehr
Padmak
In die Potenzfunktion sollte vollständigerweise eingefügt werden:
[autoit]If $sFaktor = 0 Then Return 1
[/autoit]ähm weiß einer wie man des auf über 255 stellen ausweitet?
bei 2^3^33 verlässt mich des script bei:
407023661475331324026935589930861772879300884023406278027665017185616184050616404670105703196539561201076657773776888062099130428619421393089354941182783871601000920675562596653918784481876040816544336511774321649077992197623076283675541160923344664599061197639642315029362866204036023600109934409503888149148104636513284450944184256084743960281133024474580921159066903256817026957751279448639339583538226316253113828826758886579236257197907712878535441774490876632850746478955112613387046177174883073626919437111368917302041727795512515806260855347963948176604115218032742615805304921394677710139662436361575148312293557596826231433175529960502581853173014159118162270372440138544405812300474446121562148095137007503078214796659609009691111126443434219896820745948376322429007453767270205271668422930691497854463853477245658026319004135824131685550392823746542657975166614039726216445784501681369361280154623972940908181584738990754066464483221868865801192322683046826634546425630466813109387126543546145472797466962609095398311445199195389731156375592471025936825138176143192669872292444261988299481154561050939738708049989317328979305347706707169248037684933997542880789039855351687103003456679789207906971778094856154102581070045039539830559692969712564726204435667323167828531079319559588548047868881884453608217053106162577488255075721985249708120568989433379371460938926687944756457630416426956582669318250855777622637986795370359455699538259029639275560225446433737040056495774471451317650902425278313678093130560005029003260174964570577366553086612443983552851331194654407371752636023155404758724011584152676723677412753527490514387093245500572232532485190839987756420932299126718345476838472824971358180935632113553182407302559219324647745905202396464746125796990457164097010894271814238245759497245086863025930743758664143665563201838631708090800865262983704736733138977585059031100516593577103251454697868241512160857650581945118816227560352910154469980284775017916806664088589412152395566234774582945578126805056971444178136807337723991630133996784930954386947107520788608219780610247831857101176773114512316312384903153644062976426909114381265340470016110401681195370478109069491846481306620107718507225761895141009737478328500256088400423541704864853386388742065295971907569069055838811561128628377590347695279986653658131778813257746585001049668906591557695534836830995823705511627323042366598453473614293953524488509320189727278791370254930089334508932615037044473072655973241332385188343105588199937718303360390664195074673046525760104064441374580676616427011700756993222631772092580418478068150735578133763344707202448746726690246432591617743922589584240618624816120582405317992824503327061442907632750969654678083638458709899164999418938139014687840382364170757409015356447823945554214271727507072443219381653904424488994844715434585027575397995676036541936691417170005834696454537004497770634035402933378598289579280935703615367960838998490548333128354313578140152485853378195740353008932590406440789427558052934706741169069838517471323314742233809087094817257293357452063345007755803647766641476406238852090645263766722271264245624414672138326985367061010932036699300168033440211912359814535936204688768001198806068806124436080020054259665945667834276226498560092580976754570473757656382605875368338158963409664860793187029883974652201674861612218928432441550095836531456622768636520193762379950230519995949100881890518132769239821122739589371241268173917753840116960087789280439589009775891700441099760045404221058634030485894897071241680358869912489843644167216618326829426482945979907615459784788425155288678165351570459903874966354503240818792032567296028716714484381757525277761931149606501466333401538731100145048088627075795516070200815387579427508364163188743789112185300696577051171110939947617668909052916296595963059724817175318619372983759725553564219894667928251779164904186541811060457901279964975090606074457151397677798290107242305604279291814770907219494787413314456965513953173513021709477870209717015622367708153991247469977762127892677005265112738138170277805327328690587542550627600968646186164357830858727853662624425330302824302921249982779121066817428475897016616350681981458466640785063759826516091737304145052971934537035588285608772777772695812375470526943707389507323062450771228003421684058405649587798967809511649485736128462664501857920173910272654297550854803017027835355107132625558221076834314574542345879504498863532135664053889911644267949348760922029412682415670479902914169066591352213611615834276139506935557924070994084520533710698314330389830521550815580244768474434168964638120753217124795065031598270482418292453070933980885885232026235495429642748685426167188790758098446722810109867588431055931578322203573628006715512511415484525499541490228810774219362038769188302566585921017376810455789241738286751710226424004608
sin 255 stellen
kann man des auf über 255 ausweiten?
Padmak
Ich weis nicht, was du für Probleme hast?
2^3^33 = 2^(3*33) = 2^99
Da kommt raus: 633825300114114700748351602688 und das hat genau 30 Stellen keine 255 oder sonst irgendwas...
Bei 2^1000 sieht das z.B. schon anders aus.
Ergebnis: 10715086071862673209484250490600018105614048117055336074437503883703510511249361224931983788156958581275946729175531468251871452856923140435984577574698574803934567774824230985421074605062371141877954182153046474983581941267398767559165543946077062914571196477686542167660429831652624386837205668069376
Stellen:
302, also nicht auf 255 begrenzt, wo ist das Problem?
Zitat von Padmakbei 2^3^33 verlässt mich des script bei:
Code407023661475331324026935589930861772879300884023406278027665017185616184050616404670105703196539561201076657773776888062099130428619421393089354941182783871601000920675562596653918784481876040816544336511774321649077992197623076283675541160923344664599061197639642315029362866204036023600109934409503888149148104636513284450944184256084743960281133024474580921159066903256817026957751279448639339583538226316253113828826758886579236257197907712878535441774490876632850746478955112613387046177174883073626919437111368917302041727795512515806260855347963948176604115218032742615805304921394677710139662436361575148312293557596826231433175529960502581853173014159118162270372440138544405812300474446121562148095137007503078214796659609009691111126443434219896820745948376322429007453767270205271668422930691497854463853477245658026319004135824131685550392823746542657975166614039726216445784501681369361280154623972940908181584738990754066464483221868865801192322683046826634546425630466813109387126543546145472797466962609095398311445199195389731156375592471025936825138176143192669872292444261988299481154561050939738708049989317328979305347706707169248037684933997542880789039855351687103003456679789207906971778094856154102581070045039539830559692969712564726204435667323167828531079319559588548047868881884453608217053106162577488255075721985249708120568989433379371460938926687944756457630416426956582669318250855777622637986795370359455699538259029639275560225446433737040056495774471451317650902425278313678093130560005029003260174964570577366553086612443983552851331194654407371752636023155404758724011584152676723677412753527490514387093245500572232532485190839987756420932299126718345476838472824971358180935632113553182407302559219324647745905202396464746125796990457164097010894271814238245759497245086863025930743758664143665563201838631708090800865262983704736733138977585059031100516593577103251454697868241512160857650581945118816227560352910154469980284775017916806664088589412152395566234774582945578126805056971444178136807337723991630133996784930954386947107520788608219780610247831857101176773114512316312384903153644062976426909114381265340470016110401681195370478109069491846481306620107718507225761895141009737478328500256088400423541704864853386388742065295971907569069055838811561128628377590347695279986653658131778813257746585001049668906591557695534836830995823705511627323042366598453473614293953524488509320189727278791370254930089334508932615037044473072655973241332385188343105588199937718303360390664195074673046525760104064441374580676616427011700756993222631772092580418478068150735578133763344707202448746726690246432591617743922589584240618624816120582405317992824503327061442907632750969654678083638458709899164999418938139014687840382364170757409015356447823945554214271727507072443219381653904424488994844715434585027575397995676036541936691417170005834696454537004497770634035402933378598289579280935703615367960838998490548333128354313578140152485853378195740353008932590406440789427558052934706741169069838517471323314742233809087094817257293357452063345007755803647766641476406238852090645263766722271264245624414672138326985367061010932036699300168033440211912359814535936204688768001198806068806124436080020054259665945667834276226498560092580976754570473757656382605875368338158963409664860793187029883974652201674861612218928432441550095836531456622768636520193762379950230519995949100881890518132769239821122739589371241268173917753840116960087789280439589009775891700441099760045404221058634030485894897071241680358869912489843644167216618326829426482945979907615459784788425155288678165351570459903874966354503240818792032567296028716714484381757525277761931149606501466333401538731100145048088627075795516070200815387579427508364163188743789112185300696577051171110939947617668909052916296595963059724817175318619372983759725553564219894667928251779164904186541811060457901279964975090606074457151397677798290107242305604279291814770907219494787413314456965513953173513021709477870209717015622367708153991247469977762127892677005265112738138170277805327328690587542550627600968646186164357830858727853662624425330302824302921249982779121066817428475897016616350681981458466640785063759826516091737304145052971934537035588285608772777772695812375470526943707389507323062450771228003421684058405649587798967809511649485736128462664501857920173910272654297550854803017027835355107132625558221076834314574542345879504498863532135664053889911644267949348760922029412682415670479902914169066591352213611615834276139506935557924070994084520533710698314330389830521550815580244768474434168964638120753217124795065031598270482418292453070933980885885232026235495429642748685426167188790758098446722810109867588431055931578322203573628006715512511415484525499541490228810774219362038769188302566585921017376810455789241738286751710226424004608
sin 255 stellen
Em nee, eigentlich nicht, es sind 4884 Stellen, das hätte dir aber beim anschauen schon auffallen können ...
eigentlich, wenn man es streng mathematisch macht muss man
2^(3^33) rechnen
des is meinem pc zu viel...^^
Padmak
eigentlich, wenn man es streng mathematisch macht muss man
Em streng mathematisch? Sowas musst du auch sagen, anders ist es nämlich schlicht und einfach falsch!
Abgesehen davon ist nirgendwo irgendwas auf 255 Stellen begrenz. Bei dir kommen 4884 Stellen raus...