51 lines
1.3 KiB
Plaintext
51 lines
1.3 KiB
Plaintext
Type ModInt
|
|
As Ulongint Value
|
|
As Ulongint Modulo
|
|
End Type
|
|
|
|
Function Add_(lhs As ModInt, rhs As ModInt) As ModInt
|
|
If lhs.Modulo <> rhs.Modulo Then Print "Cannot add rings with different modulus": End
|
|
Dim res As ModInt
|
|
res.Value = (lhs.Value + rhs.Value) Mod lhs.Modulo
|
|
res.Modulo = lhs.Modulo
|
|
Return res
|
|
End Function
|
|
|
|
Function Multiply(lhs As ModInt, rhs As ModInt) As ModInt
|
|
If lhs.Modulo <> rhs.Modulo Then Print "Cannot multiply rings with different modulus": End
|
|
Dim res As ModInt
|
|
res.Value = (lhs.Value * rhs.Value) Mod lhs.Modulo
|
|
res.Modulo = lhs.Modulo
|
|
Return res
|
|
End Function
|
|
|
|
Function One(self As ModInt) As ModInt
|
|
Dim res As ModInt
|
|
res.Value = 1
|
|
res.Modulo = self.Modulo
|
|
Return res
|
|
End Function
|
|
|
|
Function Power(self As ModInt, p As Ulongint) As ModInt
|
|
If p < 0 Then Print "p must be zero or greater": End
|
|
Dim pp As Ulongint = p
|
|
Dim pwr As ModInt = One(self)
|
|
While pp > 0
|
|
pp -= 1
|
|
pwr = Multiply(pwr, self)
|
|
Wend
|
|
Return pwr
|
|
End Function
|
|
|
|
Function F(x As ModInt) As ModInt
|
|
Return Add_(Power(x, 100), Add_(x, One(x)))
|
|
End Function
|
|
|
|
Dim x As ModInt
|
|
x.Value = 10
|
|
x.Modulo = 13
|
|
Dim y As ModInt = F(x)
|
|
Print Using "x ^ 100 + x + 1 for x = ModInt(&, &) is ModInt(&, &)"; x.Value; x.Modulo; y.Value; y.Modulo
|
|
|
|
Sleep
|