Modular arithmetic: Difference between revisions
Content added Content deleted
m (→{{header|Phix}}: hacky workaround...) |
|||
Line 1,604: | Line 1,604: | ||
<pre>x^100 + x + 1 for x == 10 is 1E+100 |
<pre>x^100 + x + 1 for x == 10 is 1E+100 |
||
x^100 + x + 1 for x == modint(10,13) is modint(1,13)</pre> |
x^100 + x + 1 for x == modint(10,13) is modint(1,13)</pre> |
||
=={{header|Visual Basic .NET}}== |
|||
{{trans|C#}} |
|||
<lang vbnet>Module Module1 |
|||
Interface IAddition(Of T) |
|||
Function Add(rhs As T) As T |
|||
End Interface |
|||
Interface IMultiplication(Of T) |
|||
Function Multiply(rhs As T) As T |
|||
End Interface |
|||
Interface IPower(Of T) |
|||
Function Power(pow As Integer) As T |
|||
End Interface |
|||
Interface IOne(Of T) |
|||
Function One() As T |
|||
End Interface |
|||
Class ModInt |
|||
Implements IAddition(Of ModInt), IMultiplication(Of ModInt), IPower(Of ModInt), IOne(Of ModInt) |
|||
Sub New(value As Integer, modulo As Integer) |
|||
Me.Value = value |
|||
Me.Modulo = modulo |
|||
End Sub |
|||
ReadOnly Property Value As Integer |
|||
ReadOnly Property Modulo As Integer |
|||
Public Function Add(rhs As ModInt) As ModInt Implements IAddition(Of ModInt).Add |
|||
Return Me + rhs |
|||
End Function |
|||
Public Function Multiply(rhs As ModInt) As ModInt Implements IMultiplication(Of ModInt).Multiply |
|||
Return Me * rhs |
|||
End Function |
|||
Public Function Power(pow_ As Integer) As ModInt Implements IPower(Of ModInt).Power |
|||
Return Pow(Me, pow_) |
|||
End Function |
|||
Public Function One() As ModInt Implements IOne(Of ModInt).One |
|||
Return New ModInt(1, Modulo) |
|||
End Function |
|||
Public Overrides Function ToString() As String |
|||
Return String.Format("ModInt({0}, {1})", Value, Modulo) |
|||
End Function |
|||
Public Shared Operator +(lhs As ModInt, rhs As ModInt) As ModInt |
|||
If lhs.Modulo <> rhs.Modulo Then |
|||
Throw New ArgumentException("Cannot add rings with different modulus") |
|||
End If |
|||
Return New ModInt((lhs.Value + rhs.Value) Mod lhs.Modulo, lhs.Modulo) |
|||
End Operator |
|||
Public Shared Operator *(lhs As ModInt, rhs As ModInt) As ModInt |
|||
If lhs.Modulo <> rhs.Modulo Then |
|||
Throw New ArgumentException("Cannot multiply rings with different modulus") |
|||
End If |
|||
Return New ModInt((lhs.Value * rhs.Value) Mod lhs.Modulo, lhs.Modulo) |
|||
End Operator |
|||
Public Shared Function Pow(self As ModInt, p As Integer) As ModInt |
|||
If p < 0 Then |
|||
Throw New ArgumentException("p must be zero or greater") |
|||
End If |
|||
Dim pp = p |
|||
Dim pwr = self.One() |
|||
While pp > 0 |
|||
pp -= 1 |
|||
pwr *= self |
|||
End While |
|||
Return pwr |
|||
End Function |
|||
End Class |
|||
Function F(Of T As {IAddition(Of T), IMultiplication(Of T), IPower(Of T), IOne(Of T)})(x As T) As T |
|||
Return x.Power(100).Add(x).Add(x.One) |
|||
End Function |
|||
Sub Main() |
|||
Dim x As New ModInt(10, 13) |
|||
Dim y = F(x) |
|||
Console.WriteLine("x ^ 100 + x + 1 for x = {0} is {1}", x, y) |
|||
End Sub |
|||
End Module</lang> |
|||
{{out}} |
|||
<pre>x ^ 100 + x + 1 for x = ModInt(10, 13) is ModInt(1, 13)</pre> |
|||
=={{header|Wren}}== |
=={{header|Wren}}== |