Home |
Search |
Today's Posts |
#27
![]()
Posted to microsoft.public.excel.programming
|
|||
|
|||
![]()
and use it to directly calculate mod(13^271,162653);
Hi Jerry. Just two cents. (I'm missing some of the threads here) In math programs, mod(13^271,162653) is usually done more efficiently via a number theory algorithm that usually goes by the name "PowerMod." Hence: PowerMod[13, 271, 162653] 102308 For the op, the vba algorithm usually follows Equiangular's code, where the 'p term is represented in base two. This allows vba to work with very large numbers. (above 15 if you wish, although the code is a little tricky) In Vba: n=123456789012346 ?PowerMod(n,n+1,n+2) 30910517478724 -- Dana DeLouis "Jerry W. Lewis" wrote in message ... Maple and Maxima (both symbolic math programs with unlimited precision) plus Equiangular's VBA code all agree that mod(13^271,162653) is 102308. Jerry "Joel" wrote: I still trying to determine the correct answer. I fixed some problems with my code and getting the answer 59026. Did anybody else get the answer that Jerry got 102308 Sub largemultiply() Dim MyTotal As String MyTotal = "13" For i = 1 To 270 MyTotal = Multiply(MyTotal, "13") Next i Remainder = Divide(MyTotal, "162653#") End Sub Function Multiply(parm1 As String, parm2 As String) As String Multiply = "" For i = 0 To (Len(parm2) - 1) carry# = 0 mychar2 = Mid(parm2, Len(parm2) - i, 1) total = "" For j = 0 To (Len(parm1) - 1) mychar1 = Mid(parm1, Len(parm1) - j, 1) prod = (Val(mychar1) * Val(mychar2)) + carry carry = Int(prod / 10) Remainder# = prod Mod 10 total = Trim(CStr(Remainder)) & total Next j If Multiply = "" Then If carry = 0 Then Multiply = total Else Multiply = Trim(CStr(carry)) & total End If Else Multiply = Add(Multiply, total, i) End If Next i End Function Function Add(Multiply, total, shift) carry = 0 If shift 0 Then Add = Right(Multiply, shift) Else Add = "" End If loops = Len(total) If (Len(Multiply) - shift) loops Then loops = Len(Multiply) - shift End If For i = 0 To loops - 1 If Len(Multiply) - shift i Then add1 = Val(Mid(Multiply, Len(Multiply) - (i + shift), 1)) Else add1 = 0 End If add2 = Val(Mid(total, Len(total) - i, 1)) Sum# = add1 + add2 + carry carry = Int(Sum / 10) bit = Sum Mod 10 Add = bit & Add Next i If carry < 0 Then Add = carry & Add End If End Function Function Divide(Quotent, Divisor) Dim Remainder As Long NDivisor = Val(Divisor) NewQuotent = Val(Left(Quotent, Len(Divisor))) loops = (Len(Quotent) - Len(Divisor)) For i = 0 To (loops - 1) Remainder = NewQuotent Mod NDivisor If i < loops Then Newbit = Mid(Quotent, i + Len(Divisor) + 1, 1) NewQuotent = (Remainder * 10) + Val(Newbit) End If Next i Divide = Remainder End Function "Niek Otten" wrote: Very interesting discussions! But I've hardly seen Diogo (the OP) again. My question: What would one need such a calculation for? -- Kind regards, Niek Otten Microsoft MVP - Excel "Diogo" wrote in message ... | Need to calculate via Excel: | | mod(13^271;162653) | | Any thoughts???? | | Thanks |
Thread Tools | Search this Thread |
Display Modes | |
|
|
![]() |
||||
Thread | Forum | |||
esudden extreme slowdown of charting | Charts and Charting in Excel | |||
Extreme, time-consuming processing | Excel Discussion (Misc queries) | |||
Extreme VB Scripting problems | Excel Programming | |||
Conditional Formating Extreme Question | Excel Worksheet Functions | |||
How can I minimalize the difference between extreme values on a c. | Charts and Charting in Excel |