MSLx Fanboy 0 Report post Posted July 3, 2005 I was working on a tiny UDF when for some reason it wouldn't work anymore. It looks correct to me, if any of you Mathematicians out there want to do a once-over on it, I would appreciate it... expandcollapse popupFunc _MathFactorial($mfFactor, $mfStop = 0) If (Not StringIsInt($mfFactor)) OR Not (Int($mfFactor) < 0) Then ;Invalid text entered into parameters exit with error Return 0 SetError(1) Else ;Make the parameter a number (was a string) $mfFactor = Int($mfFactor) EndIf ;0! is 1 If $mfFactor = 0 Then Return 1 Dim $return = 1 ;$mfFactor * ($mfFactor - 1) * ($mfFactor - 2) * ... * 3 * 2 * 1 While $mfFactor > $mfStop $return *= $mfFactor $mfFactor -= 1 WEnd Return $return EndFunc Func _MathPermutation($mpN, $mpR) If (Not StringIsInt($mpN)) OR (Not (Int($mpN) < 0)) OR (Not StringIsInt($mpR)) OR (Not (Int($mpR) < 0)) OR (Int($mpN) < Int($mpR)) Then ;Invalid parameters, or N is less than R (not allowed) Return 0 SetError(1) Else ;Make the parameters into numbers (was a string) $mpN = Int($mpN) $mpR = Int($mpR) EndIf Select Case $mpR = 1 Return $mpN Case $mpN = $mpR _MathFactorial($mpN) Case Else _MathFactorial($mpN, $mpR) EndSelect EndFunc MsgBox(0, "4P2", _MathFactorial(4)) I had MathFactorial working on it, then I went and did permutations, and it FUBAR'ed Writing AutoIt scripts since _DateAdd("d", -2, _NowCalcDate()) Share this post Link to post Share on other sites
Valuater 107 Report post Posted July 3, 2005 (edited) First I could find the problem...... in about a month, lol but what is this "*..." ??? 8) EDIT not sure again but you finish with this MsgBox(0, "4P2", _MathFactorial(4)) ; has 1 number but the function has 2 numbers _MathFactorial($mfFactor, $mfStop = 0) EDIT and If (Not StringIsInt($mfFactor)) and (Int($mfFactor) < 0) ; above states " $mfStop = 0 " against _MathFactorial(4)) ???? hope (blind shot ) it helps 8) Edited July 3, 2005 by Valuater Share this post Link to post Share on other sites
MSLx Fanboy 0 Report post Posted July 3, 2005 * is a symbol for multiplication. I put it in a comment to show what a factorial is.Here is a math site I used a while back for this kind of stuff._MathFactorial requires only 1 number, where the 2nd number is designed for the second function (permutations). When it is set to zero, it will multiply all numbers between the one set (4) and 1 (4 times 3 times 2 times 1) which will return 24 (it did at first).If it is set to a negative number, you can't take negative positions of 8 (if its one position of 8, its 8, if its two, its 8*7).As for that last part, the parameters are passed as strings, so it needs to be a String that is a valid integer, and then the Integer value has to be greater than zero (see last part). Writing AutoIt scripts since _DateAdd("d", -2, _NowCalcDate()) Share this post Link to post Share on other sites
MSLx Fanboy 0 Report post Posted July 3, 2005 OMFG! When I copied the string testing If Statement, I made the dumbest mistake ever Func _MathFactorial($mfFactor, $mfStop = 0) If (Not StringIsInt($mfFactor)) OR Not (Int($mfFactor) < 0) Then Should have been If (Not StringIsInt($mfFactor)) OR (Int($mfFactor) < 0) Then Writing AutoIt scripts since _DateAdd("d", -2, _NowCalcDate()) Share this post Link to post Share on other sites
MSLx Fanboy 0 Report post Posted July 3, 2005 (edited) Now, just a problem with the permutations Also, to help those who don't remember much from their algebra class...A combination is a set of numbers in any order, where a permutation is a set of numbers in a specific order. Combinations: 123 and 124 are different, 123 and 321 are the same. Permutations: 123 and 321 are different, they are in a different order. In essence, those combination locks should be called permutation locks, as those numbers must be entered in a certain order... expandcollapse popupAutoItSetOption("TrayIconDebug", 1) Func _MathFactorial($mfFactor, $mfStop = 0) If Not (StringIsInt($mfFactor)) OR (Int($mfFactor) < 0) Then ;Invalid text entered into parameters exit with error SetError(1) Return 0 Else ;Make the parameter a number (was a string) $mfFactor = Int($mfFactor) EndIf ;0! is 1 If $mfFactor = 0 Then Return 1 Dim $return = 1 ;$mfFactor * ($mfFactor - 1) * ($mfFactor - 2) * ... * 3 * 2 * 1 While $mfFactor > $mfStop $return *= $mfFactor $mfFactor -= 1 WEnd Return $return EndFunc Func _MathPermutation($mpN, $mpR) If (Not StringIsInt($mpN)) OR (Int($mpN) < 0) Then ;Invalid parameters, or N is less than R (not allowed) SetError(1) Return 0 Else ;Make the parameters into numbers (was a string) $mpN = Int($mpN) EndIf If (Not StringIsInt($mpR)) OR (Int($mpR) < 0) Then SetError(2) Return 0 Else $mpR = Int($mpR) EndIf If (Int($mpN) < Int($mpR)) Then SetError(4) Return 0 EndIf Select Case $mpR = 0 Return 1 Case $mpR = 1 Return $mpN Case $mpN = $mpR _MathFactorial($mpN) Case Else _MathFactorial($mpN, $mpR) EndSelect EndFunc MsgBox(0, "Factorial", _MathFactorial(4)) MsgBox(0, "Permutation", _MathPermutation(4, 4) & @CRLF & @error) Edited July 3, 2005 by MSLx Fanboy Writing AutoIt scripts since _DateAdd("d", -2, _NowCalcDate()) Share this post Link to post Share on other sites
buzz44 1 Report post Posted July 3, 2005 Nice, I'm currently doing probablity now at school involving Permutations and Combinations, usually I just just the "P/C" button on my calculator but lol. qq Share this post Link to post Share on other sites
Nutster 3 Report post Posted July 3, 2005 expandcollapse popupFunc _MathFactorial($mfFactor, $mfStop = 0) If Not (StringIsInt($mfFactor)) OR (Int($mfFactor) < 0) Then ;Invalid text entered into parameters exit with error SetError(1) Return 0 Else ;Make the parameter a number (was a string) $mfFactor = Int($mfFactor) EndIf ;0! is 1 If $mfFactor = 0 Then Return 1 Dim $return = 1 ;$mfFactor * ($mfFactor - 1) * ($mfFactor - 2) * ... * 3 * 2 * 1 While $mfFactor > $mfStop $return *= $mfFactor $mfFactor -= 1 WEnd Return $return EndFunc Func _MathPermutation($mpN, $mpR) If (Not StringIsInt($mpN)) OR (Int($mpN) < 0) Then ;Invalid parameters, or N is less than R (not allowed) SetError(1) Return 0 Else ;Make the parameters into numbers (was a string) $mpN = Int($mpN) EndIf If (Not StringIsInt($mpR)) OR (Int($mpR) < 0) Then SetError(2) Return 0 Else $mpR = Int($mpR) EndIf If (Int($mpN) < Int($mpR)) Then SetError(4) Return 0 EndIf Select Case $mpR = 0 Return 1 Case $mpR = 1 Return $mpN Case $mpN = $mpR _MathFactorial($mpN) Case Else _MathFactorial($mpN, $mpR) EndSelect EndFunc<{POST_SNAPBACK}>You need to Return the values from _MathFactorial for the calling function to see them.Let's see. nPr is n!/(n-r)!. So 15P3 should be 15!/(15-3)! = 15!/12! = 15*14*13 = 2730. Also, I would use a For loop for the factorial function, not the loop chosen. This should also be a little faster.For $i = $mfFactor to $mfStop + 1 Step - 1 $return *= $i Next David NuttallNuttall Computer ConsultingAn Aquarius born during the Age of AquariusAutoIt allows me to re-invent the wheel so much faster.I'm off to write a wizard, a wonderful wizard of odd... Share this post Link to post Share on other sites
MSLx Fanboy 0 Report post Posted July 3, 2005 Thanks Nutster! I can't believe I didn't catch that I forgot the Return keyword. That For loop is much nicer too, thanks! Yea! It's done and over with!!!! Writing AutoIt scripts since _DateAdd("d", -2, _NowCalcDate()) Share this post Link to post Share on other sites