Da sind aber noch einige Fehler drin
Die Switch-Schleifen sind etwas seltsam, benutze am besten If...Else
Edit: Achso! Passend zum Thema hab ich noch das hier gefunden!
http://www.br-online.de/studio-franken…34557350907.xml
Da sind aber noch einige Fehler drin
Die Switch-Schleifen sind etwas seltsam, benutze am besten If...Else
Edit: Achso! Passend zum Thema hab ich noch das hier gefunden!
http://www.br-online.de/studio-franken…34557350907.xml
Ich entschuldige mich 1000 mal für den Doppelpost, aber es muss jetzt sein...
Ich habe jetzt 2 Funktionen hinzugefügt und einen Fehler in _IsPrime korrigiert!
; #INDEX# =======================================================================================================================
; Title .........: MathEx
; AutoIt Version : 3.3.0.0 ++
; Language ......: English
; Description ...: This module contains various functions for calculating.
; ===============================================================================================================================
; #CURRENT# =====================================================================================================================
; _MathEx_Checksum
; _MathEx_IsDivisible
; _MathEx_IsPrime
; _MathEx_AccountOfSettlement
; _MathEx_Pi
; _MathEx_Max
; _MathEx_Min
; ===============================================================================================================================
; #FUNCTION# ====================================================================================================================
; Name...........: _MathEx_Checksum
; Description ...: Returns the Checksum of a number
; Syntax.........: _MathEx_Checksum($number[, $modus=0])
; Parameters ....: $number - Number to calc
; $modus - The kind of checksum: 0: normal; 1:iterate; 2:alternate
; Return values .: Success - The checksum
; Failure - -1, sets @error
; |1 - $number or $modus is not an integer
; Author ........: BugFix <BugFix at autoit dot de>, Matthias Gianfelice <matthias at gianfelice dot de>
; ===============================================================================================================================
Func _MathEx_Checksum($number, $modus = 0)
Local $integer_number_mathex_checksum = Number($number)
If IsInt($integer_number_mathex_checksum) = 1 And $integer_number_mathex_checksum > 0 And IsInt($modus) Then
While StringLen($integer_number_mathex_checksum) > 1
Local $array_number_mathex_checksum = StringSplit($integer_number_mathex_checksum, '', 2)
$integer_number_mathex_checksum = 0
If $modus = 2 Then
Local $mul = -1
For $i = UBound($array_number_mathex_checksum) - 1 To 1 Step -1
$array_number_mathex_checksum[$i - 1] = $array_number_mathex_checksum[$i] + ($mul * $array_number_mathex_checksum[$i - 1])
$mul *= -1
Next
Return $array_number_mathex_checksum[0]
Else
For $i = 0 To UBound($array_number_mathex_checksum) - 1
$integer_number_mathex_checksum += $array_number_mathex_checksum[$i]
Next
If $modus = 0 Then ExitLoop
EndIf
WEnd
Return $integer_number_mathex_checksum
Else
SetError(1)
Return -1
EndIf
EndFunc ;==>_MathEx_Checksum
; #FUNCTION# ====================================================================================================================
; Name...........: _MathEx_IsDivisible
; Description ...: Checks, whether an integer is a prime
; Syntax.........: _MathEx_IsPrime($numdividend, $numdivisor)
; Parameters ....: $numdividend - The Dividend to check
; $numdivisor - The Divisor to check
; Return values .: Success - Returns 1
; Failure - Returns 0 and sets @error
; |0 - $numdividend and $numdivisor are not divisible
; |1 - $numdivisor is 0
; |2 - $numdividdend or $numdivisor is not an integer
; Author ........: eukalyptus <eukalyptus at autoit dot de>, Matthias Gianfelice <matthias at gianfelice dot de>
; ===============================================================================================================================
Func _MathEx_IsDivisible($numdividend, $numdivisor)
Local $integer_number_mathex_dividend = Number($numdividend), $integer_number_mathex_divisor = Number($numdivisor)
If $integer_number_mathex_divisor = 0 Then
SetError(1)
Return 0
Else
If IsInt($integer_number_mathex_dividend) = 1 And $integer_number_mathex_dividend > 0 And IsInt($integer_number_mathex_divisor) = 1 And $integer_number_mathex_divisor > 0 Then
If Mod($integer_number_mathex_dividend, $integer_number_mathex_divisor) = 0 Then
Return 1
Else
SetError(0)
Return 0
EndIf
Else
SetError(2)
Return 0
EndIf
EndIf
EndFunc ;==>_MathEx_IsDivisible
; #FUNCTION# ====================================================================================================================
; Name...........: _MathEx_IsPrime
; Description ...: Checks, whether an integer is a prime
; Syntax.........: _MathEx_IsPrime($number)
; Parameters ....: $number - Number to calc
; Return values .: Success - Returns 1
; Failure - Returns 0 and sets @error
; |0 - $number is not a prime
; |1 - $number is not an integer
; Author ........: Progandy <Progandy at autoit dot de>, Matthias Gianfelice <matthias at gianfelice dot de>
; ===============================================================================================================================
Func _MathEx_IsPrime($number)
Local $integer_number_mathex_prime = Number($number)
If IsInt($integer_number_mathex_prime) = 1 And $integer_number_mathex_prime > 0 Then
If $integer_number_mathex_prime = 1 Then
SetError(0)
Return 0
EndIf
Local $prime = True
If _MathEx_IsDivisible($integer_number_mathex_prime, 2) Or _MathEx_IsDivisible($integer_number_mathex_prime, 3) Then
$prime = False
Else
For $i = 3 To $integer_number_mathex_prime / 2 Step 2
If _MathEx_IsDivisible($integer_number_mathex_prime, $i) Then
$prime = False
ExitLoop
EndIf
Next
EndIf
If $prime = False Then
SetError(0)
Return 0
Else
Return 1
EndIf
Else
SetError(1)
Return -1
EndIf
EndFunc ;==>_MathEx_IsPrime
; #FUNCTION# ====================================================================================================================
; Name...........: _MathEx_AccountOfSettlement
; Description ...: Gather a fourth size from three other sizes
; Syntax.........: _MathEx_AccountOfSettlement($firstsize, $secondsize, $thirdsize)
; Parameters ....: $firstsize, $secondsize, $thirdsize - The sizes, which are given
; Return values .: Success - Returns the fourth size
; Failure - Returns -1 and sets @error
; |1 - One string is not a number or zero
; Author ........: Matthias Gianfelice <matthias at gianfelice dot de>
; ===============================================================================================================================
Func _MathEx_AccountOfSettlement($firstsize, $secondsize, $thirdsize)
Local $integer_number_mathex_account[3] = [Number($firstsize), Number($secondsize), Number($thirdsize)], $integer_number_mathex_account_final
For $i = 0 To 2
If $integer_number_mathex_account[$i] = 0 Then
SetError(1)
Return -1
EndIf
Next
If $integer_number_mathex_account[0] = 1 Then
$integer_number_mathex_account_final = $integer_number_mathex_account[1] * $integer_number_mathex_account[2]
ElseIf $integer_number_mathex_account[2] = 1 Then
$integer_number_mathex_account_final = $integer_number_mathex_account[1] / $integer_number_mathex_account[0]
Else
$integer_number_mathex_account_final = $integer_number_mathex_account[1] * $integer_number_mathex_account[0]
$integer_number_mathex_account_final = $integer_number_mathex_account_final / $integer_number_mathex_account[2]
EndIf
Return $integer_number_mathex_account_final
EndFunc ;==>_MathEx_AccountOfSettlement
; #FUNCTION# ====================================================================================================================
; Name...........: _MathEx_Pi
; Description ...: Returns Pi
; Syntax.........: _MathEx_Pi($accuracy = 100000)
; Parameters ....: $accuracy - The accuracy of Pi
; If $accuracy is -1, Pi will be very accurately
; Return values .: Success - Returns Pi
; Failure - Returns 0 and sets @error on 1 if $accuracy is not an integer.
; Author ........: Deepred <Deepred at autoit dot de>, Matthias Gianfelice <matthias at gianfelice dot de>
; ===============================================================================================================================
Func _MathEx_Pi($accuracy = 100000)
If IsInt($accuracy) = 0 Then
SetError(1)
Return 0
Else
Local $a = 2 * Sqrt(3), $b = 3
If $accuracy = -1 Then
Do
$a = 2 * $a * $b / ($a + $b)
$b = Sqrt($a * $b)
Until $a = $b
Else
For $i = 1 To $accuracy
$a = 2 * $a * $b / ($a + $b)
$b = Sqrt($a * $b)
Next
EndIf
Return $b
EndIf
EndFunc ;==>_MathEx_Pi
; #FUNCTION# ====================================================================================================================
; Name...........: _MathEx_Max
; Description ...: Returns the biggest number in an array
; Syntax.........: _MathEx_Max($aNumbers[, $mode])
; Parameters ....: $aNumbers - The Numbers in an array. $aNumbers[0] os the first number.
; $mode - What to return:
; |0 (Default): The biggest number
; |1: The id of the array-element is returned
; |2: Both will be returned in an array: 0 is the biggest number and 1 is the array-id
; Return values .: Success - Returns a string or an array
; Failure - Returns "" and sets @error
; |1 - $aNumbers is not an array or $mode is not an integer
; |2 - One of the numbers in the array is not a number
; Remarks........: If there are more then one biggest number, the first will be returned.
; Author ........: Matthias Gianfelice <matthias at gianfelice dot de>
; ===============================================================================================================================
Func _MathEx_Max($aNumbers, $mode = 0)
If Not IsArray($aNumbers) Or Not IsInt($mode) Then
SetError(1)
Return ""
EndIf
For $i = 0 To UBound($aNumbers) - 1
If Not IsNumber($aNumbers[$i]) Then
SetError(2)
Return ""
EndIf
$aNumbers[$i] = Number($aNumbers[$i])
Next
Local $maximal_number = $aNumbers[0], $nummer = 0
For $i = 1 To UBound($aNumbers) - 1
If $aNumbers[$i] > $maximal_number Then
$maximal_number = $aNumbers[$i]
$nummer = $i
EndIf
Next
Switch $mode
Case 0
Return $maximal_number
Case 1
Return $nummer
Case 2
Local $aNumber_final[2] = [$maximal_number, $nummer]
Return $aNumber_final
EndSwitch
EndFunc ;==>_MathEx_Max
; #FUNCTION# ====================================================================================================================
; Name...........: _MathEx_Min
; Description ...: Returns the littelst number in an array
; Syntax.........: _MathEx_Min($aNumbers[, $mode])
; Parameters ....: $aNumbers - The Numbers in an array. $aNumbers[0] os the first number.
; $mode - What to return:
; |0 (Default): The littelst number
; |1: The id of the array-element is returned
; |2: Both will be returned in an array: 0 is the littelst number and 1 is the array-id
; Return values .: Success - Returns a string or an array
; Failure - Returns "" and sets @error
; |1 - $aNumbers is not an array or $mode is not an integer
; |2 - One of the numbers in the array is not a number
; Remarks........: If there are more then one littelst number, the first will be returned.
; Author ........: Matthias Gianfelice <matthias at gianfelice dot de>
; ===============================================================================================================================
Func _MathEx_Min($aNumbers, $mode = 0)
If Not IsArray($aNumbers) Or Not IsInt($mode) Then
SetError(1)
Return ""
EndIf
For $i = 0 To UBound($aNumbers) - 1
If Not IsNumber($aNumbers[$i]) Then
SetError(2)
Return ""
EndIf
$aNumbers[$i] = Number($aNumbers[$i])
Next
Local $minimal_number = $aNumbers[0], $nummer = 0
For $i = 1 To UBound($aNumbers) - 1
If $aNumbers[$i] < $minimal_number Then
$minimal_number = $aNumbers[$i]
$nummer = $i
EndIf
Next
Switch $mode
Case 0
Return $minimal_number
Case 1
Return $nummer
Case 2
Local $aNumber_final[2] = [$minimal_number, $nummer]
Return $aNumber_final
EndSwitch
EndFunc ;==>_MathEx_Min
Den Download in Post #1 werde ich jetzt auch aktualisieren!
Sorry, hab grad noch nen Fehlr in IsPrime gefunden 2 ist ein Primzahl, aber wird nicht erkannt.
Also noch ein ElseIf $integer_number_mathex_prime==2 einfügen
Sorry, stimmt, 2 wird rausgeworfen. Hier die korrigierte Fassung:
#INDEX# =======================================================================================================================
; Title .........: MathEx
; AutoIt Version : 3.3.0.0 ++
; Language ......: English
; Description ...: This module contains various functions for calculating.
; ===============================================================================================================================
; #CURRENT# =====================================================================================================================
; _MathEx_Checksum
; _MathEx_IsDivisible
; _MathEx_IsPrime
; _MathEx_AccountOfSettlement
; _MathEx_Pi
; _MathEx_Max
; _MathEx_Min
; ===============================================================================================================================
; #FUNCTION# ====================================================================================================================
; Name...........: _MathEx_Checksum
; Description ...: Returns the Checksum of a number
; Syntax.........: _MathEx_Checksum($number[, $modus=0])
; Parameters ....: $number - Number to calc
; $modus - The kind of checksum: 0: normal; 1:iterate; 2:alternate
; Return values .: Success - The checksum
; Failure - -1, sets @error
; |1 - $number or $modus is not an integer
; Author ........: BugFix <BugFix at autoit dot de>, Matthias Gianfelice <matthias at gianfelice dot de>
; ===============================================================================================================================
Func _MathEx_Checksum($number, $modus = 0)
Local $integer_number_mathex_checksum = Number($number)
If IsInt($integer_number_mathex_checksum) = 1 And $integer_number_mathex_checksum > 0 And IsInt($modus) Then
While StringLen($integer_number_mathex_checksum) > 1
Local $array_number_mathex_checksum = StringSplit($integer_number_mathex_checksum, '', 2)
$integer_number_mathex_checksum = 0
If $modus = 2 Then
Local $mul = -1
For $i = UBound($array_number_mathex_checksum) - 1 To 1 Step -1
$array_number_mathex_checksum[$i - 1] = $array_number_mathex_checksum[$i] + ($mul * $array_number_mathex_checksum[$i - 1])
$mul *= -1
Next
Return $array_number_mathex_checksum[0]
Else
For $i = 0 To UBound($array_number_mathex_checksum) - 1
$integer_number_mathex_checksum += $array_number_mathex_checksum[$i]
Next
If $modus = 0 Then ExitLoop
EndIf
WEnd
Return $integer_number_mathex_checksum
Else
SetError(1)
Return -1
EndIf
EndFunc ;==>_MathEx_Checksum
; #FUNCTION# ====================================================================================================================
; Name...........: _MathEx_IsDivisible
; Description ...: Checks, whether an integer is a prime
; Syntax.........: _MathEx_IsPrime($numdividend, $numdivisor)
; Parameters ....: $numdividend - The Dividend to check
; $numdivisor - The Divisor to check
; Return values .: Success - Returns 1
; Failure - Returns 0 and sets @error
; |0 - $numdividend and $numdivisor are not divisible
; |1 - $numdivisor is 0
; |2 - $numdividdend or $numdivisor is not an integer
; Author ........: eukalyptus <eukalyptus at autoit dot de>, Matthias Gianfelice <matthias at gianfelice dot de>
; ===============================================================================================================================
Func _MathEx_IsDivisible($numdividend, $numdivisor)
Local $integer_number_mathex_dividend = Number($numdividend), $integer_number_mathex_divisor = Number($numdivisor)
If $integer_number_mathex_divisor = 0 Then
SetError(1)
Return 0
Else
If IsInt($integer_number_mathex_dividend) = 1 And $integer_number_mathex_dividend > 0 And IsInt($integer_number_mathex_divisor) = 1 And $integer_number_mathex_divisor > 0 Then
If Mod($integer_number_mathex_dividend, $integer_number_mathex_divisor) = 0 Then
Return 1
Else
SetError(0)
Return 0
EndIf
Else
SetError(2)
Return 0
EndIf
EndIf
EndFunc ;==>_MathEx_IsDivisible
; #FUNCTION# ====================================================================================================================
; Name...........: _MathEx_IsPrime
; Description ...: Checks, whether an integer is a prime
; Syntax.........: _MathEx_IsPrime($number)
; Parameters ....: $number - Number to calc
; Return values .: Success - Returns 1
; Failure - Returns 0 and sets @error
; |0 - $number is not a prime
; |1 - $number is not an integer
; Author ........: Progandy <Progandy at autoit dot de>, Matthias Gianfelice <matthias at gianfelice dot de>
; ===============================================================================================================================
Func _MathEx_IsPrime($number)
Local $integer_number_mathex_prime = Number($number)
If IsInt($integer_number_mathex_prime) = 1 And $integer_number_mathex_prime > 0 Then
If $integer_number_mathex_prime = 1 Then
SetError(0)
Return 0
ElseIf $integer_number_mathex_prime = 2 Then
Return 1
EndIf
Local $prime = True
If _MathEx_IsDivisible($integer_number_mathex_prime, 2) Or _MathEx_IsDivisible($integer_number_mathex_prime, 3) Then
$prime = False
Else
For $i = 3 To $integer_number_mathex_prime / 2 Step 2
If _MathEx_IsDivisible($integer_number_mathex_prime, $i) Then
$prime = False
ExitLoop
EndIf
Next
EndIf
If $prime = False Then
SetError(0)
Return 0
Else
Return 1
EndIf
Else
SetError(1)
Return -1
EndIf
EndFunc ;==>_MathEx_IsPrime
; #FUNCTION# ====================================================================================================================
; Name...........: _MathEx_AccountOfSettlement
; Description ...: Gather a fourth size from three other sizes
; Syntax.........: _MathEx_AccountOfSettlement($firstsize, $secondsize, $thirdsize)
; Parameters ....: $firstsize, $secondsize, $thirdsize - The sizes, which are given
; Return values .: Success - Returns the fourth size
; Failure - Returns -1 and sets @error
; |1 - One string is not a number or zero
; Author ........: Matthias Gianfelice <matthias at gianfelice dot de>
; ===============================================================================================================================
Func _MathEx_AccountOfSettlement($firstsize, $secondsize, $thirdsize)
Local $integer_number_mathex_account[3] = [Number($firstsize), Number($secondsize), Number($thirdsize)], $integer_number_mathex_account_final
For $i = 0 To 2
If $integer_number_mathex_account[$i] = 0 Then
SetError(1)
Return -1
EndIf
Next
If $integer_number_mathex_account[0] = 1 Then
$integer_number_mathex_account_final = $integer_number_mathex_account[1] * $integer_number_mathex_account[2]
ElseIf $integer_number_mathex_account[2] = 1 Then
$integer_number_mathex_account_final = $integer_number_mathex_account[1] / $integer_number_mathex_account[0]
Else
$integer_number_mathex_account_final = $integer_number_mathex_account[1] * $integer_number_mathex_account[0]
$integer_number_mathex_account_final = $integer_number_mathex_account_final / $integer_number_mathex_account[2]
EndIf
Return $integer_number_mathex_account_final
EndFunc ;==>_MathEx_AccountOfSettlement
; #FUNCTION# ====================================================================================================================
; Name...........: _MathEx_Pi
; Description ...: Returns Pi
; Syntax.........: _MathEx_Pi($accuracy = 100000)
; Parameters ....: $accuracy - The accuracy of Pi
; If $accuracy is -1, Pi will be very accurately
; Return values .: Success - Returns Pi
; Failure - Returns 0 and sets @error on 1 if $accuracy is not an integer.
; Author ........: Deepred <Deepred at autoit dot de>, Matthias Gianfelice <matthias at gianfelice dot de>
; ===============================================================================================================================
Func _MathEx_Pi($accuracy = 100000)
If IsInt($accuracy) = 0 Then
SetError(1)
Return 0
Else
Local $a = 2 * Sqrt(3), $b = 3
If $accuracy = -1 Then
Do
$a = 2 * $a * $b / ($a + $b)
$b = Sqrt($a * $b)
Until $a = $b
Else
For $i = 1 To $accuracy
$a = 2 * $a * $b / ($a + $b)
$b = Sqrt($a * $b)
Next
EndIf
Return $b
EndIf
EndFunc ;==>_MathEx_Pi
; #FUNCTION# ====================================================================================================================
; Name...........: _MathEx_Max
; Description ...: Returns the biggest number in an array
; Syntax.........: _MathEx_Max($aNumbers[, $mode])
; Parameters ....: $aNumbers - The Numbers in an array. $aNumbers[0] os the first number.
; $mode - What to return:
; |0 (Default): The biggest number
; |1: The id of the array-element is returned
; |2: Both will be returned in an array: 0 is the biggest number and 1 is the array-id
; Return values .: Success - Returns a string or an array
; Failure - Returns "" and sets @error
; |1 - $aNumbers is not an array or $mode is not an integer
; |2 - One of the numbers in the array is not a number
; Remarks........: If there are more then one biggest number, the first will be returned.
; Author ........: Matthias Gianfelice <matthias at gianfelice dot de>
; ===============================================================================================================================
Func _MathEx_Max($aNumbers, $mode = 0)
If Not IsArray($aNumbers) Or Not IsInt($mode) Then
SetError(1)
Return ""
EndIf
For $i = 0 To UBound($aNumbers) - 1
If Not IsNumber($aNumbers[$i]) Then
SetError(2)
Return ""
EndIf
$aNumbers[$i] = Number($aNumbers[$i])
Next
Local $maximal_number = $aNumbers[0], $nummer = 0
For $i = 1 To UBound($aNumbers) - 1
If $aNumbers[$i] > $maximal_number Then
$maximal_number = $aNumbers[$i]
$nummer = $i
EndIf
Next
Switch $mode
Case 0
Return $maximal_number
Case 1
Return $nummer
Case 2
Local $aNumber_final[2] = [$maximal_number, $nummer]
Return $aNumber_final
EndSwitch
EndFunc ;==>_MathEx_Max
; #FUNCTION# ====================================================================================================================
; Name...........: _MathEx_Min
; Description ...: Returns the littelst number in an array
; Syntax.........: _MathEx_Min($aNumbers[, $mode])
; Parameters ....: $aNumbers - The Numbers in an array. $aNumbers[0] os the first number.
; $mode - What to return:
; |0 (Default): The littelst number
; |1: The id of the array-element is returned
; |2: Both will be returned in an array: 0 is the littelst number and 1 is the array-id
; Return values .: Success - Returns a string or an array
; Failure - Returns "" and sets @error
; |1 - $aNumbers is not an array or $mode is not an integer
; |2 - One of the numbers in the array is not a number
; Remarks........: If there are more then one littelst number, the first will be returned.
; Author ........: Matthias Gianfelice <matthias at gianfelice dot de>
; ===============================================================================================================================
Func _MathEx_Min($aNumbers, $mode = 0)
If Not IsArray($aNumbers) Or Not IsInt($mode) Then
SetError(1)
Return ""
EndIf
For $i = 0 To UBound($aNumbers) - 1
If Not IsNumber($aNumbers[$i]) Then
SetError(2)
Return ""
EndIf
$aNumbers[$i] = Number($aNumbers[$i])
Next
Local $minimal_number = $aNumbers[0], $nummer = 0
For $i = 1 To UBound($aNumbers) - 1
If $aNumbers[$i] < $minimal_number Then
$minimal_number = $aNumbers[$i]
$nummer = $i
EndIf
Next
Switch $mode
Case 0
Return $minimal_number
Case 1
Return $nummer
Case 2
Local $aNumber_final[2] = [$minimal_number, $nummer]
Return $aNumber_final
EndSwitch
EndFunc ;==>_MathEx_Min
Übrigens, bezüglich If _isPrime(1):
Eine Primzahl ist doch eine Zahl mit genau(!) zwei Teilern. Die 1 hat nur einen Teiler.
*klugscheiß off*
Eine Primzahl ist nur durch 1 und sich selbst teilbar - und das trifft auf 1 völlig zu
Vielleicht hilft eine Flag-Option weiter, wo man selbst entscheiden kann, ob 1 nun eine Primzahl ist oda nicht
lgE
EDIT: *klugscheiß off*
Die Schlacht um die Primzahldefinition
Zitat von eukalyptusEine Primzahl ist nur durch 1 und sich selbst teilbar - und das trifft auf 1 völlig zu
Das macht bei mir aber zwei Faktoren
Hierbei sollte man auf keinen Fall den Ergebnissen von Google oder Wikipedia allein trauen.
Hier das Ergebnis der Suchmaschine von princeton.edu:
http://wordnetweb.princeton.edu/perl/webwn?s=prime%20number
Dazu passend auch diese, wie ich finde gute Erklärung: Warum 1 keine Primzahl ist
Also generell kann man sagen: 1 ist keine Primzahl, wie gesagt, es müssen 2 versch. Teiler sein. @L3viathan2142, du Klugscheißer ! 1 wird rausgesiebt
Hallo zusammen,
ich schliesse mich der Meinung von Progandy, BugFix & Co an, 1 ist keine Primzahl.
@MatthiasG, ich glaube @progandy wollte dir mit Beitrag #18 einen Hinweis geben. Mir fallen dazu 2 Stichwörter ein: 1. Vergleichstabelle führen oder 2. Rekursion benutzen.
mfg (Auto)Bert
Hallo allerseits!
Habe ein bisschen gearbeitet und heraus gekommen ist das hier:
; #INDEX# =======================================================================================================================
; Title .........: MathEx
; AutoIt Version : 3.3.0.0 ++
; Language ......: English
; Description ...: This module contains various functions for calculating.
; ===============================================================================================================================
; #CURRENT# =====================================================================================================================
; _MathEx_Checksum
; _MathEx_IsDivisible
; _MathEx_IsPrime
; _MathEx_AccountOfSettlement
; _MathEx_Pi
; _MathEx_Max
; _MathEx_Min
; _MathEx_CreatePrimes
; ===============================================================================================================================
; #FUNCTION# ====================================================================================================================
; Name...........: _MathEx_Checksum
; Description ...: Returns the Checksum of a number
; Syntax.........: _MathEx_Checksum($number[, $modus=0])
; Parameters ....: $number - Number to calc
; $modus - The kind of checksum: 0: normal; 1:iterate; 2:alternate
; Return values .: Success - The checksum
; Failure - -1, sets @error
; |1 - $number or $modus is not an integer
; Author ........: BugFix <BugFix at autoit dot de>, Matthias Gianfelice <matthias at gianfelice dot de>
; ===============================================================================================================================
Func _MathEx_Checksum($number, $modus = 0)
Local $integer_number_mathex_checksum = Number($number)
If IsInt($integer_number_mathex_checksum) = 1 And $integer_number_mathex_checksum > 0 And IsInt($modus) Then
While StringLen($integer_number_mathex_checksum) > 1
Local $array_number_mathex_checksum = StringSplit($integer_number_mathex_checksum, '', 2)
$integer_number_mathex_checksum = 0
If $modus = 2 Then
Local $mul = -1
For $i = UBound($array_number_mathex_checksum) - 1 To 1 Step -1
$array_number_mathex_checksum[$i - 1] = $array_number_mathex_checksum[$i] + ($mul * $array_number_mathex_checksum[$i - 1])
$mul *= -1
Next
Return $array_number_mathex_checksum[0]
Else
For $i = 0 To UBound($array_number_mathex_checksum) - 1
$integer_number_mathex_checksum += $array_number_mathex_checksum[$i]
Next
If $modus = 0 Then ExitLoop
EndIf
WEnd
Return $integer_number_mathex_checksum
Else
SetError(1)
Return -1
EndIf
EndFunc ;==>_MathEx_Checksum
; #FUNCTION# ====================================================================================================================
; Name...........: _MathEx_IsDivisible
; Description ...: Checks, whether an integer is a prime
; Syntax.........: _MathEx_IsPrime($numdividend, $numdivisor)
; Parameters ....: $numdividend - The Dividend to check
; $numdivisor - The Divisor to check
; Return values .: Success - Returns 1
; Failure - Returns 0 and sets @error
; |0 - $numdividend and $numdivisor are not divisible
; |1 - $numdivisor is 0
; |2 - $numdividdend or $numdivisor is not an integer
; Author ........: eukalyptus <eukalyptus at autoit dot de>, Matthias Gianfelice <matthias at gianfelice dot de>
; ===============================================================================================================================
Func _MathEx_IsDivisible($numdividend, $numdivisor)
Local $integer_number_mathex_dividend = Number($numdividend), $integer_number_mathex_divisor = Number($numdivisor)
If $integer_number_mathex_divisor = 0 Then
SetError(1)
Return 0
Else
If IsInt($integer_number_mathex_dividend) = 1 And $integer_number_mathex_dividend > 0 And IsInt($integer_number_mathex_divisor) = 1 And $integer_number_mathex_divisor > 0 Then
If Mod($integer_number_mathex_dividend, $integer_number_mathex_divisor) = 0 Then
Return 1
Else
SetError(0)
Return 0
EndIf
Else
SetError(2)
Return 0
EndIf
EndIf
EndFunc ;==>_MathEx_IsDivisible
; #FUNCTION# ====================================================================================================================
; Name...........: _MathEx_IsPrime
; Description ...: Checks, whether an integer is a prime
; Syntax.........: _MathEx_IsPrime($number)
; Parameters ....: $number - Number to calc
; Return values .: Success - Returns 1
; Failure - Returns 0 and sets @error
; |0 - $number is not a prime
; |1 - $number is not an integer
; Author ........: Progandy <Progandy at autoit dot de>, Matthias Gianfelice <matthias at gianfelice dot de>
; ===============================================================================================================================
Func _MathEx_IsPrime($number)
Local $integer_number_mathex_prime = Number($number)
If IsInt($integer_number_mathex_prime) = 1 And $integer_number_mathex_prime > 0 Then
If $integer_number_mathex_prime = 1 Then
SetError(0)
Return 0
ElseIf $integer_number_mathex_prime = 2 Then
Return 1
EndIf
Local $prime = True
If _MathEx_IsDivisible($integer_number_mathex_prime, 2) Or _MathEx_IsDivisible($integer_number_mathex_prime, 3) Then
$prime = False
Else
For $i = 3 To $integer_number_mathex_prime / 2 Step 2
If _MathEx_IsDivisible($integer_number_mathex_prime, $i) Then
$prime = False
ExitLoop
EndIf
Next
EndIf
If $prime = False Then
SetError(0)
Return 0
Else
Return 1
EndIf
Else
SetError(1)
Return -1
EndIf
EndFunc ;==>_MathEx_IsPrime
; #FUNCTION# ====================================================================================================================
; Name...........: _MathEx_AccountOfSettlement
; Description ...: Gather a fourth size from three other sizes
; Syntax.........: _MathEx_AccountOfSettlement($firstsize, $secondsize, $thirdsize)
; Parameters ....: $firstsize, $secondsize, $thirdsize - The sizes, which are given
; Return values .: Success - Returns the fourth size
; Failure - Returns -1 and sets @error
; |1 - One string is not a number or zero
; Author ........: Matthias Gianfelice <matthias at gianfelice dot de>
; ===============================================================================================================================
Func _MathEx_AccountOfSettlement($firstsize, $secondsize, $thirdsize)
Local $integer_number_mathex_account[3] = [Number($firstsize), Number($secondsize), Number($thirdsize)], $integer_number_mathex_account_final
For $i = 0 To 2
If $integer_number_mathex_account[$i] = 0 Then
SetError(1)
Return -1
EndIf
Next
If $integer_number_mathex_account[0] = 1 Then
$integer_number_mathex_account_final = $integer_number_mathex_account[1] * $integer_number_mathex_account[2]
ElseIf $integer_number_mathex_account[2] = 1 Then
$integer_number_mathex_account_final = $integer_number_mathex_account[1] / $integer_number_mathex_account[0]
Else
$integer_number_mathex_account_final = $integer_number_mathex_account[1] * $integer_number_mathex_account[0]
$integer_number_mathex_account_final = $integer_number_mathex_account_final / $integer_number_mathex_account[2]
EndIf
Return $integer_number_mathex_account_final
EndFunc ;==>_MathEx_AccountOfSettlement
; #FUNCTION# ====================================================================================================================
; Name...........: _MathEx_Pi
; Description ...: Returns Pi
; Syntax.........: _MathEx_Pi($accuracy = 100000)
; Parameters ....: $accuracy - The accuracy of Pi
; If $accuracy is -1, Pi will be very accurately
; Return values .: Success - Returns Pi
; Failure - Returns 0 and sets @error on 1 if $accuracy is not an integer.
; Author ........: Deepred <Deepred at autoit dot de>, Matthias Gianfelice <matthias at gianfelice dot de>
; ===============================================================================================================================
Func _MathEx_Pi($accuracy = 100000)
If IsInt($accuracy) = 0 Then
SetError(1)
Return 0
Else
Local $a = 2 * Sqrt(3), $b = 3
If $accuracy = -1 Then
Do
$a = 2 * $a * $b / ($a + $b)
$b = Sqrt($a * $b)
Until $a = $b
Else
For $i = 1 To $accuracy
$a = 2 * $a * $b / ($a + $b)
$b = Sqrt($a * $b)
Next
EndIf
Return $b
EndIf
EndFunc ;==>_MathEx_Pi
; #FUNCTION# ====================================================================================================================
; Name...........: _MathEx_Max
; Description ...: Returns the biggest number in an array
; Syntax.........: _MathEx_Max($aNumbers[, $mode])
; Parameters ....: $aNumbers - The Numbers in an array. $aNumbers[0] os the first number.
; $mode - What to return:
; |0 (Default): The biggest number
; |1: The id of the array-element is returned
; |2: Both will be returned in an array: 0 is the biggest number and 1 is the array-id
; Return values .: Success - Returns a string or an array
; Failure - Returns "" and sets @error
; |1 - $aNumbers is not an array or $mode is not an integer
; |2 - One of the numbers in the array is not a number
; Remarks........: If there are more then one biggest number, the first will be returned.
; Author ........: Matthias Gianfelice <matthias at gianfelice dot de>
; ===============================================================================================================================
Func _MathEx_Max($aNumbers, $mode = 0)
If Not IsArray($aNumbers) Or Not IsInt($mode) Then
SetError(1)
Return ""
EndIf
For $i = 0 To UBound($aNumbers) - 1
If Not IsNumber($aNumbers[$i]) Then
SetError(2)
Return ""
EndIf
$aNumbers[$i] = Number($aNumbers[$i])
Next
Local $maximal_number = $aNumbers[0], $nummer = 0
For $i = 1 To UBound($aNumbers) - 1
If $aNumbers[$i] > $maximal_number Then
$maximal_number = $aNumbers[$i]
$nummer = $i
EndIf
Next
Switch $mode
Case 0
Return $maximal_number
Case 1
Return $nummer
Case 2
Local $aNumber_final[2] = [$maximal_number, $nummer]
Return $aNumber_final
EndSwitch
EndFunc ;==>_MathEx_Max
; #FUNCTION# ====================================================================================================================
; Name...........: _MathEx_Min
; Description ...: Returns the littelst number in an array
; Syntax.........: _MathEx_Min($aNumbers[, $mode])
; Parameters ....: $aNumbers - The Numbers in an array. $aNumbers[0] os the first number.
; $mode - What to return:
; |0 (Default): The littelst number
; |1: The id of the array-element is returned
; |2: Both will be returned in an array: 0 is the littelst number and 1 is the array-id
; Return values .: Success - Returns a string or an array
; Failure - Returns "" and sets @error
; |1 - $aNumbers is not an array or $mode is not an integer
; |2 - One of the numbers in the array is not a number
; Remarks........: If there are more then one littelst number, the first will be returned.
; Author ........: Matthias Gianfelice <matthias at gianfelice dot de>
; ===============================================================================================================================
Func _MathEx_Min($aNumbers, $mode = 0)
If Not IsArray($aNumbers) Or Not IsInt($mode) Then
SetError(1)
Return ""
EndIf
For $i = 0 To UBound($aNumbers) - 1
If Not IsNumber($aNumbers[$i]) Then
SetError(2)
Return ""
EndIf
$aNumbers[$i] = Number($aNumbers[$i])
Next
Local $minimal_number = $aNumbers[0], $nummer = 0
For $i = 1 To UBound($aNumbers) - 1
If $aNumbers[$i] < $minimal_number Then
$minimal_number = $aNumbers[$i]
$nummer = $i
EndIf
Next
Switch $mode
Case 0
Return $minimal_number
Case 1
Return $nummer
Case 2
Local $aNumber_final[2] = [$minimal_number, $nummer]
Return $aNumber_final
EndSwitch
EndFunc ;==>_MathEx_Min
; #FUNCTION# ====================================================================================================================
; Name...........: _MathEx_CreatePrimes
; Description ...: Returns an array full of primes
; Syntax.........: _MathEx_CreatePrimes($number)
; Parameters ....: $numbers - Between 2 and $number the primes will be searched
; Return values .: Success - Returns an array
; |0 - How many Primes are in the array?
; |1 to n - the primes
; Failure - Returns 0 and sets @error if $number is not an integer
; Author ........: AutoBert <AutoBert at autoit dot de>, Matthias Gianfelice <matthias at gianfelice dot de>
; ===============================================================================================================================
Func _MathEx_CreatePrimes($number)
If Not IsInt($number) Then
SetError(1)
Return 0
EndIf
$number += 3
Local $gestrichen[$number - 2]
For $i = 0 To $number - 3
$gestrichen[$i] = False
Next
Local $i = 2
While $i * $i <= $number
If Not $gestrichen[$i] Then
For $j = $i * $i To $number - 3 Step $i
$gestrichen[$j] = True
Next
EndIf
$i = $i + 1
WEnd
Local $anzahl = 0
For $i = 2 To $number - 3
If Not $gestrichen[$i] Then $anzahl += 1
Next
Local $Return_Primzahlen[$anzahl + 1], $aktuell = 1
$Return_Primzahlen[0] = $anzahl
For $i = 2 To $number - 3
If Not $gestrichen[$i] Then
$Return_Primzahlen[$aktuell] = $i
$aktuell += 1
EndIf
Next
Return $Return_Primzahlen
EndFunc ;==>_MathEx_CreatePrimes
Eine neu Funktion ist neben den beiden anderen (_MathEx_Min bzw. Max aus der letzten Version) hinzu gekommen: _MathEx_CreatePrimes($biswohin)
Diese Funktion gibt alle Primzahlen von 2 bis zur übergebenen Zahl, und das relativ schnell.
Ich möchte mich an dieser Stelle noch mal für den Einsatz aller Helfer bedanken, die ich auch namentlich als Autoren aufgeführt habe, besonders für die letzte Funktion an AutoBert: Danke!
In der nächsten Version steht wohl an, weitere Performanceschraiben zu drehen und ein neues Beispielskript fertig zu machen.
Bis dahin wünsche ich viel Spaß mit der aktuellen Version, wenn es jemand benutzt, würde ich mich um eine Rückmeldung freuen
Hallo @MatthiasG.,
das mit der Performanceschraube hat für die Primzahlen ja wunderbar geklappt , aber dass du mich als Author aufführst ist zuviel der Ehre, ich hab keine einzige Zeile Code geschrieben.
Wenn ich mit der neuen Funktion die Primzahlen von 1 bis 10000 errechnen lasse, dauert das ungefähr 170 ms, die alte Funktion braucht um 9973 auf Prim zu prüfen ungefähr 421 ms, das entspricht ungefähr Fakor 2,5. Lass ich aber mit der alten Funktion alle Pimzahlen bis 10000 errechnen, dauert es ungefähr 153000 ms das entspricht Faktor 900.
Wenn du die Funktion noch erweiterst, das man die bisher errechneten Primzahlen wieder laden kann, hat man bei weiteren Aufrufen die Ergebnisse für bereits geteste Prims sofort, bzw. schneller wenn die neue Zahl größer als die höchste Prim bzw. bisher getestete Zahl ist.
Edit1: Zeiten auf Acer NetBook Aspire one mit 1,6 Ghz Atom-Prozessor
mfg (Auto)Bert
Danke nochmal für die Komplimente
Das Problem mit dem erneuten Aufruf der Funktion wäre, dass diese dann zwei Arrays Global reservieren müsste, aber ich könnte es theoretisch ausprobieren!
Keinesfalls ist das zuviel der Ehre! Wer hat denn für mich alles zusammengesucht und hat mir immer geholfen? Ich finde, das ist gerechtfertigt, ich kann mir gut vorstellen, dass du deine Zeit hättest sinnvoller verbraten können.
Ich werde auch versuchen die alte Primzahlen-Funktion schneller zu machen, und zwar auf die neue basierend. Mal schauen ob es funktioniert
Hallo @MatthiasG.,
da du ja alle gefundenen Primzahlen bis zur zu überprüfenden Zahl zurückgibst, brauchst du ja nur schauen ob diese als letzte gefundene enthalten ist. Ich hab gerade für die Lösung IsPrime2 von @DeepRed ein paar Zahlen überprüft, waren alle richtig. Ich schlage daher vor ihr du oder er schreibt ein Testprogramm und beweist damit anhand deiner _MathEx_CreatePrimes und seiner IsPrime2 das ihr beide die gleichen Prims findet (beide alle) , wenn ja habt ihr eine sehr schnelle Routine für eine einzelne Primzahl .
mfg (Auto)Bert
Du sollteset nur Zahlen aus folgendem Bereich für den CreatePrimes zulassen:
[autoit]If $number < 2 Or $number > 16777215 Then Return SetError(2,0,0)
[/autoit]
< 2 gibt es nichts und das andere sprecgt die Array-Grenze.
Ok, das werde ich in der nächsten Version übernehmen! Wie viele Daten sind denn das Maximum in einem Array?
So viel:
ZitatYou can use up to 64 dimensions in an Array. The total number of entries cannot be greater than 2^24 (16 777 216).
Bei dir ist alsodie maximale Zahl 16777215, da 16777215 +3 -2 = 16777216
Ok, werde das abfangen, danke!
Mach doch noch eine UDF, wo man die PQ-Formel ausrechnen kann. Also so ungefähr: _MathEx_Get_PQ_Result($Value1,$Value2)
Hier mal ein Beispiel:
[autoit]$p = -7
$q = 12
$rechnenplus = -($p / 2) + Sqrt(($p / 2) ^ 2 - $q)
$rechnenminus = -($p / 2) - Sqrt(($p / 2) ^ 2 - $q)
MsgBox(0, "Lösung", "Plus = " & $rechnenplus & @CRLF & "Minus = " & $rechnenminus)
[/autoit]In Ordnung, werde ich gerne einbauen!
Wenn jemand anderes noch Ideen hat, immer her damit!
PQ:
dim $p,$q,$z,$y,$a,$b,$c
$p=inputbox("P:","P ist:")
$q=inputbox("Q:","Q ist:")
$z=$p/2
$z=$z*$z
$z=$z-$q
if $z<0 then
msgbox(0,"Lösung","Es gibt keine Lösung!" & @CRLF & "Schreiben Sie L={Ø}.")
Exit
endif
if $z=0 then
$z=-$p/2
msgbox(0,"Lösung",$z)
Exit
endif
$c=$z
$z=Sqrt($c)
$y=-$p/2
$a=$y+$z
$b=$y-$z
msgbox(0,"Lösung",$a & " und " & $b)
Übrigens nicht wegen Progstil wundern, das war vor 1 1/2 Jahren..;)