MathEx UDF

  • Du musst einem auch alles vorweg nehmen :) .
    Jetzt kümmert sich keiner mehr drum, das möchte ich machen 8)

  • Hallo @MatthiasG.,

    hab gerade deine neue Funktion zur Errechnung aller Primzahlen mit der Zahl 16777215 getestet, die Funktion findet
    1.077.871 Prims Die größte ist 16.777.213 benötigte Zeit auf meinem Rechner ungefähr 300 sec. Deine alte Routine benötigt
    zum Errechnen dieser Prim (nach einer minimalen Änderung von mir ungefähr 0,56 ms). Aber auf die wirklich einfache Lösung wo die Zeit verlorenging, kommst du sicher selbst.

    mfg (Auto)Bert

  • So, habe alle Funktionen noch mal überarbeitet, inzwischen habe ich gemerkt, dass man die Kommentare auch auf Deutsch schreiben kann :thumbup: Bitte weitere Kommentare etc.! Hab ich noch Wünsche offen gelassen?

  • Hallo MatthiasG,

    hab die neue _MathEx_IsPrime ausprobiert, bin über den Performancegewinn sehr überrascht. Super Zeitgewinn von > 421 ms jetzt ~ 3,5 ms:thumbup: (wobei bei meinen schmalen Resourcen, die Zeitmessung, schon fast wie auswürfeln ist). Wenn du deine _MathEx_IsDivisible noch gegen not Mod austauschst kannst du die Performance noch etwas erhöhen.

    Übrigens deine _MathEx_CreatePrimes bildet das Sieb des Sieb des Eratosthenes nach (zumindest sieht es danach aus, als hättest du seine Regeln umgesetzt). Hier hab ich ja schon mal den Wunsch geäussert, die bereits errechneten Prims abspeichern und wieder laden zu können, damit ich endlich in den Wettbewerb wer findet die grösste Prim einsteigen kann ;) .
    Das Sieb des Atkin soll noch schneller sein, das ist jetzt aber noch nicht wichtig. Wichtiger erscheint mir dass du ein gutes Beispielprogramm (leichtes Handling) schreibst, damit alle den Wert der Umsetzung deiner UDF erkennen,

    mfg (Auto)Bert

  • Danke für deine tollen Tests und deine Antwort! Ich werde alle Vrorschläge mit einbeziehen (s. aktualisierte ToDo-List), muss das aber leider auf später vertagen, da ich gerade an einem Groß-Projekt arbeite...

  • Hallo,

    vielleicht kannst du diese Funktion noch einbauen: Standard Abweichung

    Spoiler anzeigen
    [autoit]

    ; Standard Abweichung
    Func _StandardDeviation($aNumber)
    If IsArray($aNumber) Then
    Local $d = _MathEx_Mean($aNumber)
    Local $v = 0
    Local $n = UBound($aNumber)
    For $i = 0 To $n - 1
    $v += (Number($aNumber[$i]) - $d) ^ 2
    Next

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

    Return Sqrt($v / $n)
    EndIf

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

    SetError(1, "", 0)
    EndFunc ;==>_StandardDeviation

    [/autoit]

    dabei ist mir aufgefallen, daß dein arithmetisches Mittel ein quadratisches ist (Zeile 392)

    Ach ja und PI:
    $pi = 4 * ATan(1)
    aber das ist wahrscheinlich zu unspektakulär ...

    Grüße
    Stilgar

  • Danke Stilgar!

    Habe die Sachen zunächst "nur" in meiner To-Do-Liste aufgenommen, im Moment fehlt mir leider die Zeit, werde es aber auf jedem Fall korrigieren! :)

  • Hey!
    Mir ist grade deine Math-UDF aufgefallen und muss sagen, dass ihr schon gute Arbeit geleistet habt ^^
    Und da mir grade langweilig war, hab ich dir auch mal ein paar Funks gebastelt.. Hoffe du kannst sie gebrauchen!

    Spoiler anzeigen
    [autoit]

    ; #FUNCTION# ====================================================================================================================
    ; Name...........: _MathEx_ggT
    ; Beschreibung...: Gibt den größten gemeinsamen Teiler von 2 Zahlen an.
    ; Syntax.........: _MathEx_ggT($a,$b)
    ; Parameter......: $a,$b - Zwei beliebige Zahlen ($a <> 0)
    ; Rückgabe.......: Erfolg - Gibt einen Integer zurück
    ; Fehler - Gibt "" zurück und setzt @error
    ; |1 - $a = 0
    ; Bemerkungen....: Die Zahl $a darf nicht = 0 sein.
    ; Autor(en)......: Niko H. bzw. ChaosKeks
    ; ===============================================================================================================================
    Func _MathEx_ggT($a,$b)
    If $a = 0 Then
    return SetError(1, 0, "")
    Elseif $b = 0 Then
    return $a
    Elseif $a = $b Then
    return $a
    Elseif $a < 0 Or $b < 0 Then
    return 1
    Endif
    While $a <> $b
    If $a > $b Then
    $a = $a - $b
    Else
    $b = $b -$a
    EndIf
    Wend
    return $a
    EndFunc ;==>_MathEx_ggT

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

    ; #FUNCTION# ====================================================================================================================
    ; Name...........: _MathEx_kgV
    ; Beschreibung...: Gibt den kleinsten gemeinsamen Vielfachen von 2 Zahlen an.
    ; Syntax.........: _MathEx_kgV($a,$b)
    ; Parameter......: $a,$b - Zwei beliebige Zahlen
    ; Rückgabe.......: Erfolg - Gibt einen Integer zurück
    ; Fehler - Gibt "" zurück und setzt @error
    ; |1 - $a = 0
    ; Bemerkungen....: Die Zahl $a darf nicht = 0 sein.
    ; Autor(en)......: Niko H. bzw. ChaosKeks
    ; ===============================================================================================================================
    Func _MathEx_kgV($a,$b)
    Local $ggT = _MathEx_ggT($a,$b)
    If $a = 0 Then
    return SetError(1,0,"")
    EndIF
    return $a*$b/$ggT
    EndFunc ;==>_MathEx_kgV

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

    ; #FUNCTION# ====================================================================================================================
    ; Name...........: _MathEx_Faculty
    ; Beschreibung...: Gibt die Fakultät einer Zahl resultierend aus deren Bezugszahl an.
    ; Syntax.........: _MathEx_kgV($a, [$b])
    ; Parameter......: $a,$b - Zwei beliebige positive Intergers
    ; Rückgabe.......: Erfolg - Gibt einen Integer zurück
    ; Fehler - Gibt "" zurück und setzt @error
    ; |1 - $a oder $b ist negativ
    ; |2 - $a oder $b ist kein Integer
    ; |3 - $b ist größer als $a
    ; Bemerkungen....: Rekursive Fakultäten sind nicht eingeschlossen.
    ; Autor(en)......: Niko H. bzw. ChaosKeks
    ; ===============================================================================================================================
    Func _MathEx_Faculty($a, $b = 1)
    Local $fak = 1
    If $a < 0 or $b < 0 Then
    return SetError(1,0,"")
    ElseIf isInt($a) = 0 Or isInt($b) = 0 Then
    return SetError(2,0,"")
    ElseIf $b > $a Then
    return SetError(3,0,"")
    EndIf
    For $i = $b To $a
    $fak *= $i
    Next
    return $fak
    EndFunc ;==>_MathEx_Faculty

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

    ; #FUNCTION# ====================================================================================================================
    ; Name...........: ;==>_MathEx_EulNumber
    ; Beschreibung...: Gibt die eulerische Zahl relativ genau zurück
    ; Syntax.........: _MathEx_EulNumber($accuracy = 65)
    ; Parameter......: $accuracy - Die Genauigkeit von der eulerischen Zahl.
    ; Rückgaben......: Erfolg - Gibt eine Annäherung der eulerischen Zahl zurück
    ; Gibt "" zurück und setzt @error
    ; |1 - $accuracy > 0
    ; |2 - $accuracy < 0
    ; |3 - $ccuracy ist kein Integer
    ; Bemerkungen....: Die eulerische Zahl kann über einer Accuracy von über 65 nicht mehr angegeben werden!
    ; Autor(en)......: Niko H. bzw. ChaosKeks
    ; ===============================================================================================================================
    Func _MathEx_EulNumber($accuracy = 65)
    Local $eul = 1
    If $accuracy > 65 Then
    return SetError(1,0,"")
    ElseIf $accuracy < 0 Then
    return SetError(2,0,"")
    ElseIf IsInt($accuracy) = 0 Then
    return SetError(3,0,"")
    Else
    For $i = 1 To $accuracy
    $eul += 1/_MathEx_Faculty($i)
    Next
    EndIf
    return $eul
    EndFunc ;==>_MathEx_EulNumber

    [/autoit]

    Bitteschön!

    EDIT: ups hab grade Beitrag 42 gelesen :D naja zur not kannste auch den Autorennamen ändern (bin nich so geil auf Titel)..

    2 Mal editiert, zuletzt von ChaosKeks (13. Mai 2009 um 20:49)

  • Hallo allerseits!

    Habe eine neue Version hochgeladen, inklusive Beispiel. Eine Funktion wurde gelöscht, 11 hinzugefügt. Macht 13-1+11 = 23 ;)
    Inklusive Beispiel (jetzt wisst ihr, warum ich euch bezgl. Console.au3 von BugFix nerven musste :rolleyes: )

    Einen schönen Tag noch!

  • Hallo!

    Danke, freut mich zu hören. Werde demnächst weitere geometrische Funktionen im Sinne von _MathEx_Point_xxx oder _MathEx_GraphInfo erstellen...
    Würde mich auch freuen zu hören, wofür das benutzt wird ;)

  • Hier 2 weitere Funktionen (LN und Fakultät):


    Spoiler anzeigen
    [autoit]


    ; #FUNCTION# ====================================================================================================================
    ; Name...........: _MathEx_LN
    ; Beschreibung...: Berechnet den natürlichen Logarithmus (logarithmus naturalis)
    ; Syntax.........: _MathEx_LN($x)
    ; Parameter......: $x - berechnet den natürlichen Logarithmus von $x
    ; Rückgabe.......: Erfolg - Gibt das Ergebnis $ln zurück
    ; Fehler - Gibt False zurück
    ; Eigenschaften..: Definitionsbereich: 0 < $x < unendlich
    ; Wertebereich: -unendlich < f(x) < unendlich
    ; Monotonie: x > 1: streng monoton steigend, 0 < x < 1: streng monoton fallend
    ; keine Symmetrien (Punkt- und Spiegelsymmertrien), keine Periodizität
    ; Autor(en)......: UEZ
    ; ===============================================================================================================================
    Func _MathEx_LN($x)
    Local $ln, $e = 2.71828182845904523536
    If Not IsString($x) And $x > 0 Then
    If $x = 1 Then
    Return 0
    Else
    $ln = Log($x) / Log($e)
    Return $ln
    EndIf
    Else
    Return False
    EndIf
    EndFunc ;==>_MathEx_LN

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

    ; #FUNCTION# ====================================================================================================================
    ; Name...........: _MathEx_Fak
    ; Beschreibung...: Berechnet die Fakultät der Zahl n
    ; Syntax.........: _MathEx_Fak($n)
    ; Parameter......: $n - berechnet die Fakultät der Zahl n => f(n) = 1 * 2 * 3 * 4 * ... * n
    ; Rückgabe.......: Erfolg - Gibt das Ergebnis $fak zurück
    ; Fehler - Gibt False zurück
    ; Eigenschaften..: n ist Element der natürlichen Zahlen
    ; Definitionsbereich: 0! = 1, 1! = 1, n > 1: f(n) = 1 * 2 * 3 * 4 * ... * n
    ; Näherungsformel nach Stirling (für große n): n! = Sqrt(2*pi*n)*(n/e)^n * (1 + 1/(12*n) + 1/(288*n^2))
    ; Limitierung....: bis n = 25 möglich, da noch kein long int implementiert
    ; Autor(en)......: UEZ
    ; ===============================================================================================================================
    Func _MathEx_Fak($n)
    Local $fak = 1, $i
    If Not IsFloat($n) And Not IsString($n) Then
    If $n > 1 Then
    For $i = 2 to $n
    $fak *= $i
    Next
    Return $fak
    ElseIf $n = 1 Then
    Return 1
    ElseIf $n = 0 Then
    Return 1
    Else
    Return False
    EndIf
    Else
    Return False
    EndIf
    EndFunc ;==>_MathEx_Fak

    [/autoit]


    Vielleicht folgen noch weitere ... ;)

    Gruß,
    UEZ

    Edit: ups, Fakultät gibt es ja schon :huh:

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

    Einmal editiert, zuletzt von UEZ (13. November 2009 um 09:02)

  • Hallo UEZ!

    Danke für deine Funktionen! Ja, Fakultät gibt es in der neusten Versio. Macht doch nichts, trotzdem danke! :)
    Meinst du mit Ln zufälligerweise Log()?

    Ich kann mit dem Namen leider nichts anfangen, kannst du bitte kurz erläutern, was damit gemeint ist?

    • Offizieller Beitrag

    Meinst du mit Ln zufälligerweise Log()?


    Log() wird (leider) auch zur Bezeichnung des natürlichen Logarithmus verwendet. Eindeutig ist aber Ln().
    Der natürliche Logarithmus verwendet als Basis die Eulersche Zahl.

    Dieser Logarithmus ist wohl einer der beliebtesten. :) Kann mich an viele Mathestunden erinnern, in denen wir bis zum Geht-Nicht-Mehr integriert und differenziert haben. Was mit diesem Log besser als mit allen anderen geht.

  • Hallo UEZ!

    Danke für deine Funktionen! Ja, Fakultät gibt es in der neusten Versio. Macht doch nichts, trotzdem danke! :)
    Meinst du mit Ln zufälligerweise Log()?

    Ich kann mit dem Namen leider nichts anfangen, kannst du bitte kurz erläutern, was damit gemeint ist?

    Da du noch 15 bist, kannst du nichts mit LN anfangen, aber wenn du mal das Vergnügen haben wirst die Oberstufe zu besuchen, wirst du auf jeden Fall LN kennen lernen. :D

    Vorgeschmack hier: http://de.wikipedia.org/wiki/Logarithm…lle_Logarithmen

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • In Ordnung, danke ihr beiden. Ich baue die Funktion in _MathEx_Log ein, mit einem Flag, oder ist es dir lieber, wenn ich das _MathEx_Ln nenne?

  • In Ordnung, danke ihr beiden. Ich baue die Funktion in _MathEx_Log ein, mit einem Flag, oder ist es dir lieber, wenn ich das _MathEx_Ln nenne?

    Log() ist ungleich LN(), deshalb sollte LN als selbststängige Funktion gelistet sein.

    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯