MathEx UDF

  • 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!

    Spoiler anzeigen
    [autoit]

    ; #INDEX# =======================================================================================================================
    ; Title .........: MathEx
    ; AutoIt Version : 3.3.0.0 ++
    ; Language ......: English
    ; Description ...: This module contains various functions for calculating.
    ; ===============================================================================================================================

    [/autoit] [autoit][/autoit] [autoit]

    ; #CURRENT# =====================================================================================================================
    ; _MathEx_Checksum
    ; _MathEx_IsDivisible
    ; _MathEx_IsPrime
    ; _MathEx_AccountOfSettlement
    ; _MathEx_Pi
    ; _MathEx_Max
    ; _MathEx_Min
    ; ===============================================================================================================================

    [/autoit] [autoit][/autoit] [autoit]

    ; #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

    [/autoit] [autoit][/autoit] [autoit]

    ; #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

    [/autoit] [autoit][/autoit] [autoit]

    ; #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

    [/autoit] [autoit][/autoit] [autoit]

    ; #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

    [/autoit] [autoit][/autoit] [autoit]

    ; #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

    [/autoit] [autoit][/autoit] [autoit]

    ; #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

    [/autoit] [autoit][/autoit] [autoit]

    ; #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

    [/autoit]

    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:

    Spoiler anzeigen
    [autoit]

    #INDEX# =======================================================================================================================
    ; Title .........: MathEx
    ; AutoIt Version : 3.3.0.0 ++
    ; Language ......: English
    ; Description ...: This module contains various functions for calculating.
    ; ===============================================================================================================================

    [/autoit] [autoit][/autoit] [autoit]

    ; #CURRENT# =====================================================================================================================
    ; _MathEx_Checksum
    ; _MathEx_IsDivisible
    ; _MathEx_IsPrime
    ; _MathEx_AccountOfSettlement
    ; _MathEx_Pi
    ; _MathEx_Max
    ; _MathEx_Min
    ; ===============================================================================================================================

    [/autoit] [autoit][/autoit] [autoit]

    ; #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

    [/autoit] [autoit][/autoit] [autoit]

    ; #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

    [/autoit] [autoit][/autoit] [autoit]

    ; #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

    [/autoit] [autoit][/autoit] [autoit]

    ; #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

    [/autoit] [autoit][/autoit] [autoit]

    ; #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

    [/autoit] [autoit][/autoit] [autoit]

    ; #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

    [/autoit] [autoit][/autoit] [autoit]

    ; #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

    [/autoit]
    • Offizieller Beitrag

    Die Schlacht um die Primzahldefinition :D

    Zitat von eukalyptus

    Eine Primzahl ist nur durch 1 und sich selbst teilbar - und das trifft auf 1 völlig zu ;)

    Das macht bei mir aber zwei Faktoren :P

    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 :D ! 1 wird rausgesiebt :rofl:

  • 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:

    Spoiler anzeigen
    [autoit]

    ; #INDEX# =======================================================================================================================
    ; Title .........: MathEx
    ; AutoIt Version : 3.3.0.0 ++
    ; Language ......: English
    ; Description ...: This module contains various functions for calculating.
    ; ===============================================================================================================================

    [/autoit] [autoit][/autoit] [autoit]

    ; #CURRENT# =====================================================================================================================
    ; _MathEx_Checksum
    ; _MathEx_IsDivisible
    ; _MathEx_IsPrime
    ; _MathEx_AccountOfSettlement
    ; _MathEx_Pi
    ; _MathEx_Max
    ; _MathEx_Min
    ; _MathEx_CreatePrimes
    ; ===============================================================================================================================

    [/autoit] [autoit][/autoit] [autoit]

    ; #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

    [/autoit] [autoit][/autoit] [autoit]

    ; #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

    [/autoit] [autoit][/autoit] [autoit]

    ; #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

    [/autoit] [autoit][/autoit] [autoit]

    ; #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

    [/autoit] [autoit][/autoit] [autoit]

    ; #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

    [/autoit] [autoit][/autoit] [autoit]

    ; #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

    [/autoit] [autoit][/autoit] [autoit]

    ; #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

    [/autoit] [autoit][/autoit] [autoit]

    ; #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

    [/autoit]

    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 :thumbup:

  • Hallo @MatthiasG.,

    das mit der Performanceschraube hat für die Primzahlen ja wunderbar geklappt :thumbup: , 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:

    Zitat

    You 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

  • 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

    [/autoit][autoit][/autoit][autoit]

    $rechnenplus = -($p / 2) + Sqrt(($p / 2) ^ 2 - $q)
    $rechnenminus = -($p / 2) - Sqrt(($p / 2) ^ 2 - $q)

    [/autoit][autoit][/autoit][autoit]

    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!

    ToDo-List
    • Performance des Primzahlchecks erhöhen
    • Grenze beim Erstellen der Primzahlen setzen
    • PQ-Formle-Rechner
  • PQ:

    Spoiler anzeigen
    [autoit]


    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)

    [/autoit]


    Übrigens nicht wegen Progstil wundern, das war vor 1 1/2 Jahren..;)

    Twitter: @L3viathan2142
    Benutze AutoIt persönlich nicht mehr, da ich keinen Windows-Rechner mehr besitze.

    Einmal editiert, zuletzt von L3viathan2142 (18. April 2009 um 00:08)