Data commit
This commit is contained in:
parent
7387c8f97b
commit
cb5bb5e222
199093 changed files with 3378972 additions and 0 deletions
|
|
@ -0,0 +1,115 @@
|
|||
Imports System.Numerics
|
||||
|
||||
Module Module1
|
||||
|
||||
Class Solution
|
||||
ReadOnly root1 As BigInteger
|
||||
ReadOnly root2 As BigInteger
|
||||
ReadOnly exists As Boolean
|
||||
|
||||
Sub New(r1 As BigInteger, r2 As BigInteger, e As Boolean)
|
||||
root1 = r1
|
||||
root2 = r2
|
||||
exists = e
|
||||
End Sub
|
||||
|
||||
Public Function GetRoot1() As BigInteger
|
||||
Return root1
|
||||
End Function
|
||||
|
||||
Public Function GetRoot2() As BigInteger
|
||||
Return root2
|
||||
End Function
|
||||
|
||||
Public Function GetExists() As Boolean
|
||||
Return exists
|
||||
End Function
|
||||
End Class
|
||||
|
||||
Function Ts(n As BigInteger, p As BigInteger) As Solution
|
||||
If BigInteger.ModPow(n, (p - 1) / 2, p) <> 1 Then
|
||||
Return New Solution(0, 0, False)
|
||||
End If
|
||||
|
||||
Dim q As BigInteger = p - 1
|
||||
Dim ss = BigInteger.Zero
|
||||
While (q Mod 2) = 0
|
||||
ss += 1
|
||||
q >>= 1
|
||||
End While
|
||||
|
||||
If ss = 1 Then
|
||||
Dim r1 = BigInteger.ModPow(n, (p + 1) / 4, p)
|
||||
Return New Solution(r1, p - r1, True)
|
||||
End If
|
||||
|
||||
Dim z As BigInteger = 2
|
||||
While BigInteger.ModPow(z, (p - 1) / 2, p) <> p - 1
|
||||
z += 1
|
||||
End While
|
||||
Dim c = BigInteger.ModPow(z, q, p)
|
||||
Dim r = BigInteger.ModPow(n, (q + 1) / 2, p)
|
||||
Dim t = BigInteger.ModPow(n, q, p)
|
||||
Dim m = ss
|
||||
|
||||
Do
|
||||
If t = 1 Then
|
||||
Return New Solution(r, p - r, True)
|
||||
End If
|
||||
Dim i = BigInteger.Zero
|
||||
Dim zz = t
|
||||
While zz <> 1 AndAlso i < (m - 1)
|
||||
zz = zz * zz Mod p
|
||||
i += 1
|
||||
End While
|
||||
Dim b = c
|
||||
Dim e = m - i - 1
|
||||
While e > 0
|
||||
b = b * b Mod p
|
||||
e = e - 1
|
||||
End While
|
||||
r = r * b Mod p
|
||||
c = b * b Mod p
|
||||
t = t * c Mod p
|
||||
m = i
|
||||
Loop
|
||||
End Function
|
||||
|
||||
Sub Main()
|
||||
Dim pairs = New List(Of Tuple(Of Long, Long)) From {
|
||||
New Tuple(Of Long, Long)(10, 13),
|
||||
New Tuple(Of Long, Long)(56, 101),
|
||||
New Tuple(Of Long, Long)(1030, 10009),
|
||||
New Tuple(Of Long, Long)(1032, 10009),
|
||||
New Tuple(Of Long, Long)(44402, 100049),
|
||||
New Tuple(Of Long, Long)(665820697, 1000000009),
|
||||
New Tuple(Of Long, Long)(881398088036, 1000000000039)
|
||||
}
|
||||
|
||||
For Each pair In pairs
|
||||
Dim sol = Ts(pair.Item1, pair.Item2)
|
||||
Console.WriteLine("n = {0}", pair.Item1)
|
||||
Console.WriteLine("p = {0}", pair.Item2)
|
||||
If sol.GetExists() Then
|
||||
Console.WriteLine("root1 = {0}", sol.GetRoot1())
|
||||
Console.WriteLine("root2 = {0}", sol.GetRoot2())
|
||||
Else
|
||||
Console.WriteLine("No solution exists")
|
||||
End If
|
||||
Console.WriteLine()
|
||||
Next
|
||||
|
||||
Dim bn = BigInteger.Parse("41660815127637347468140745042827704103445750172002")
|
||||
Dim bp = BigInteger.Pow(10, 50) + 577
|
||||
Dim bsol = Ts(bn, bp)
|
||||
Console.WriteLine("n = {0}", bn)
|
||||
Console.WriteLine("p = {0}", bp)
|
||||
If bsol.GetExists() Then
|
||||
Console.WriteLine("root1 = {0}", bsol.GetRoot1())
|
||||
Console.WriteLine("root2 = {0}", bsol.GetRoot2())
|
||||
Else
|
||||
Console.WriteLine("No solution exists")
|
||||
End If
|
||||
End Sub
|
||||
|
||||
End Module
|
||||
Loading…
Add table
Add a link
Reference in a new issue