Try this:
Function ModInv(b As Long, m As Long) As Variant
' Returns the modular inverse of b Mod m using the
' Extended Euclidean Algorithm to compute integers x and y
' {x, y || b * x + m * y = GCD(b, m) == 1 (else the inverse does not exist)}
' i.e., Mod(x * b, m) = 1
' Algorithm from Junaid Majeed at
' http://www.codeproject.com/KB/recipes/eealgo.aspx
Dim ak As Long, ak1 As Long, ak2 As Long
Dim xk As Long, xk1 As Long, xk2 As Long
Dim yk As Long, yk1 As Long, yk2 As Long
Dim qk As Long, qk1 As Long, qk2 As Long
If Abs(GCD(b, m)) <> 1 Then
ModInv = CVErr(xlErrValue)
Exit Function
Else
ak1 = b
xk1 = 1
yk1 = 0
ak = m
xk = 0
yk = 1
qk = Int(ak1 / ak)
Do
ak2 = ak1: ak1 = ak
xk2 = xk1: xk1 = xk
yk2 = yk1: yk1 = yk
qk2 = qk1: qk1 = qk
ak = ak2 - qk1 * ak1
If ak = 0 Then Exit Do
xk = xk2 - qk1 * xk1
yk = yk2 - qk1 * yk1
qk = Int(ak1 / ak)
Loop
End If
ModInv = xk1
End Function
Function GCD(ByVal i1 As Long, ByVal i2 As Long) As Long
If i2 = 0 Then
GCD = i1
Else
GCD = GCD(i2, i1 Mod i2)
End If
End Function
Bookmarks