RosettaCodeData/Task/Modular-arithmetic/VBA/modular-arithmetic.vba

83 lines
1.8 KiB
Plaintext

Option Base 1
Private Function mi_one(ByVal a As Variant) As Variant
If IsArray(a) Then
a(1) = 1
Else
a = 1
End If
mi_one = a
End Function
Private Function mi_add(ByVal a As Variant, b As Variant) As Variant
If IsArray(a) Then
If IsArray(b) Then
If a(2) <> b(2) Then
mi_add = CVErr(2019)
Else
a(1) = (a(1) + b(1)) Mod a(2)
mi_add = a
End If
Else
mi_add = CVErr(2018)
End If
Else
If IsArray(b) Then
mi_add = CVErr(2018)
Else
a = a + b
mi_add = a
End If
End If
End Function
Private Function mi_mul(ByVal a As Variant, b As Variant) As Variant
If IsArray(a) Then
If IsArray(b) Then
If a(2) <> b(2) Then
mi_mul = CVErr(2019)
Else
a(1) = (a(1) * b(1)) Mod a(2)
mi_mul = a
End If
Else
mi_mul = CVErr(2018)
End If
Else
If IsArray(b) Then
mi_mul = CVErr(2018)
Else
a = a * b
mi_mul = a
End If
End If
End Function
Private Function mi_power(x As Variant, p As Integer) As Variant
res = mi_one(x)
For i = 1 To p
res = mi_mul(res, x)
Next i
mi_power = res
End Function
Private Function mi_print(m As Variant) As Variant
If IsArray(m) Then
s = "modint(" & m(1) & "," & m(2) & ")"
Else
s = CStr(m)
End If
mi_print = s
End Function
Private Function f(x As Variant) As Variant
f = mi_add(mi_power(x, 100), mi_add(x, mi_one(x)))
End Function
Private Sub test(x As Variant)
Debug.Print "x^100 + x + 1 for x == " & mi_print(x) & " is " & mi_print(f(x))
End Sub
Public Sub main()
test 10
test [{10,13}]
End Sub