Artemis.Math : Fibonacci und Fakultät mit Caching v1.01

Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Neue Antwort erstellen

Artemis

Betreff: Artemis.Math : Fibonacci und Fakultät mit Caching v1.01

BeitragSa, Nov 25, 2006 18:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Da ich woanders ein Tutorial über effektives Caching von rekursiven Funktionen gelesen habe, folgt hier mein kleines Modul, welches Fibonacci-Zahlen und die Fakultät einer Zahl Berechnet und gleichzeitig speicher, um es beim nächsten Aufruf schneller zurückgeben zu können.

Informationen zur Installation:
Das Modul heißt Artemis.Math und kann entweder über den deutschen Modserver (blitzhelp.net) gesynct oder als zap-Datei heruntergeladen werden.
Diese Zap-Datei kann entweder per bmk unzapmod datei.zap oder mit der Batch-Datei unzap.bat, welche mit der Zap-Datei ins Verzeichnis BlitzMax\mod kopiert wird, entpackt werden.
Das Modul ist bereits für Windows vorkompiliert.
DOWNLOAD: artemis.math.zap

Die beiden Funktionen erklären sich von selbst.

Und hier ist ein kleiner Geschwindigkeitstests-Code: [AUSKLAPPEN]
SuperStrict

Import Artemis.Math

' Anzahl der Durchgänge
Const loop_amount:Int = 1000
' Höchste Zahl (da es ein Byte ist, sowieso nur bis 255)
' ACHTUNG: Fibonacci-Zahlen brauchen ab ca. 30 ziemlich lange
Const MAX_ZAHL:Byte = 30

Function Factorial:Int(n:Int)
   If n < 0 Then Return 0
   If n = 0 Then Return 1
   If n = 1 Then Return 1
   Return Factorial(n-1) * n
EndFunction

Function Fibonacci:Int(n:Int)
   If n < 0 Then Return 0
   If n = 0 Then Return 0
   If n = 1 Then Return 1
   Return Fibonacci(n-1) + Fibonacci(n-2)
EndFunction

Local time_start:Int
Local time_end  :Int

Local loop:Int

Local values:Byte[] = New Byte[loop_amount]
For loop = 1 To loop_amount
   values[loop-1] = Rand(0, MAX_ZAHL)
Next

' Fakultät ohne Caching
time_start = MilliSecs()
For loop = 1 To loop_amount
   Factorial(values[loop-1])
Next
time_end = MilliSecs()
Print "Fakultaet ohne Caching: "+(time_end-time_start)

' Fakultät mit Caching
time_start = MilliSecs()
For loop = 1 To loop_amount
   TMath.Factorial(values[loop-1])
Next
time_end = MilliSecs()
Print "Fakultaet mit Caching: "+(time_end-time_start)

' Fibonacci ohne Caching
time_start = MilliSecs()
For loop = 1 To loop_amount
   Fibonacci(values[loop-1])
Next
time_end = MilliSecs()
Print "Fibonacci ohne Caching: "+(time_end-time_start)

' Fibonacci mit Caching
time_start = MilliSecs()
For loop = 1 To loop_amount
   TMath.Fibonacci(values[loop-1])
Next
time_end = MilliSecs()
Print "Fibonacci mit Caching: "+(time_end-time_start)

Artemis

BeitragDi, Nov 28, 2006 22:01
Antworten mit Zitat
Benutzer-Profile anzeigen
So kleines Update.

Habe, da es für Bézierkurven benötigt wird, die Berechnung für Bersteinpolynome und Binomialkoeffizienten hinzugefügt.

Download wie schon beschrieben über Modserver oder zap-Datei.

Hier auch der Quell-Code: [AUSKLAPPEN]
SuperStrict

Rem
bbdoc: Math
about:
Enhält mathematische Funktionen.
EndRem
Module Artemis.Math

ModuleInfo "Version: 1.01"
ModuleInfo "Author: Artemis"
ModuleInfo "License: Public Domain"
ModuleInfo "Modserver: BlitzHelp"
ModuleInfo ":"
ModuleInfo "History: 1.01"
ModuleInfo "History: Hinzugefügt: Funktionen um ein Bersteinpolynom und einen Binomialkoeffizienten zu berechnen."
ModuleInfo "History: 1.00 erste Version"

Rem
bbdoc: Enthält mathematische Funktionen.
EndRem
Type TMath
   
   Global factorial_values:Int[] = [1, 1]
   Global fibonacci_values:Int[] = [0, 1]
   
   Rem
   bbdoc: Gibt die Fakultät einer Zahl zurück.
   EndRem
   Function Factorial:Int(n:Int)
      If n < 0 Then Return 0
      If TMath.factorial_values.length <= n Then
         TMath.factorial_values = TMath.factorial_values[..n+1]
      EndIf
      If TMath.factorial_values[n] = 0 Then
         TMath.factorial_values[n] = n*TMath.Factorial(n-1)
      EndIf
      Return TMath.factorial_values[n]
   EndFunction
   
   Rem
   bbdoc: Gibt die Fibonacci-Zahl einer Zahl zurück.
   EndRem
   Function Fibonacci:Int(n:Int)
      If n < 0 Then Return 0
      If TMath.fibonacci_values.length <= n Then
         TMath.fibonacci_values = TMath.fibonacci_values[..n+1]
      EndIf
      If (TMath.fibonacci_values[n] = 0) And (n > 0) Then
         TMath.fibonacci_values[n] = TMath.Fibonacci(n-1)+TMath.Fibonacci(n-2)
      EndIf
      Return TMath.fibonacci_values[n]
   EndFunction
   
   Rem
   bbdoc: Berechnet ein Bersteinpolynom.
   EndRem
   Function BernsteinPolynomial:Float(i:Int, n:Int, t:Float)
      Return TMath.BinomialCoefficient(n, i) * (t^i) * ((1-t)^(n-i))
   EndFunction
   
   Rem
   bbdoc: Berechnet einen Binomialkoeffizient.
   EndRem
   Function BinomialCoefficient:Int(n:Int, k:Int)
      Return TMath.Factorial(n) / (TMath.Factorial(k)*TMath.Factorial(n-k))
   EndFunction
   
EndType

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group