Initial data commit
This commit is contained in:
parent
72d218235f
commit
f23f22d71c
199087 changed files with 3378941 additions and 0 deletions
|
|
@ -0,0 +1,163 @@
|
|||
' version 11-04-2017
|
||||
' compile with: fbc -s console
|
||||
' maximum for p is 17 digits to be on the save side
|
||||
|
||||
' TRUE/FALSE are built-in constants since FreeBASIC 1.04
|
||||
' But we have to define them for older versions.
|
||||
#Ifndef TRUE
|
||||
#Define FALSE 0
|
||||
#Define TRUE Not FALSE
|
||||
#EndIf
|
||||
|
||||
Function mul_mod(a As ULongInt, b As ULongInt, modulus As ULongInt) As ULongInt
|
||||
' returns a * b mod modulus
|
||||
Dim As ULongInt x, y = a Mod modulus
|
||||
|
||||
While b > 0
|
||||
If (b And 1) = 1 Then
|
||||
x = (x + y) Mod modulus
|
||||
End If
|
||||
y = (y Shl 1) Mod modulus
|
||||
b = b Shr 1
|
||||
Wend
|
||||
|
||||
Return x
|
||||
|
||||
End Function
|
||||
|
||||
Function pow_mod(b As ULongInt, power As ULongInt, modulus As ULongInt) As ULongInt
|
||||
' returns b ^ power mod modulus
|
||||
Dim As ULongInt x = 1
|
||||
|
||||
While power > 0
|
||||
If (power And 1) = 1 Then
|
||||
' x = (x * b) Mod modulus
|
||||
x = mul_mod(x, b, modulus)
|
||||
End If
|
||||
' b = (b * b) Mod modulus
|
||||
b = mul_mod(b, b, modulus)
|
||||
power = power Shr 1
|
||||
Wend
|
||||
|
||||
Return x
|
||||
|
||||
End Function
|
||||
|
||||
Function Isprime(n As ULongInt, k As Long) As Long
|
||||
' miller-rabin prime test
|
||||
If n > 9223372036854775808ull Then ' limit 2^63, pow_mod/mul_mod can't handle bigger numbers
|
||||
Print "number is to big, program will end"
|
||||
Sleep
|
||||
End
|
||||
End If
|
||||
|
||||
' 2 is a prime, if n is smaller then 2 or n is even then n = composite
|
||||
If n = 2 Then Return TRUE
|
||||
If (n < 2) OrElse ((n And 1) = 0) Then Return FALSE
|
||||
|
||||
Dim As ULongInt a, x, n_one = n - 1, d = n_one
|
||||
Dim As UInteger s
|
||||
|
||||
While (d And 1) = 0
|
||||
d = d Shr 1
|
||||
s = s + 1
|
||||
Wend
|
||||
|
||||
While k > 0
|
||||
k = k - 1
|
||||
a = Int(Rnd * (n -2)) +2 ' 2 <= a < n
|
||||
x = pow_mod(a, d, n)
|
||||
If (x = 1) Or (x = n_one) Then Continue While
|
||||
For r As Integer = 1 To s -1
|
||||
x = pow_mod(x, 2, n)
|
||||
If x = 1 Then Return FALSE
|
||||
If x = n_one Then Continue While
|
||||
Next
|
||||
If x <> n_one Then Return FALSE
|
||||
Wend
|
||||
Return TRUE
|
||||
|
||||
End Function
|
||||
|
||||
Function legendre_symbol (a As LongInt, p As LongInt) As LongInt
|
||||
|
||||
Dim As LongInt x = pow_mod(a, ((p -1) \ 2), p)
|
||||
If p -1 = x Then
|
||||
Return x - p
|
||||
Else
|
||||
Return x
|
||||
End If
|
||||
|
||||
End Function
|
||||
|
||||
' ------=< MAIN >=------
|
||||
|
||||
Dim As LongInt b, c, i, k, m, n, p, q, r, s, t, z
|
||||
|
||||
For k = 1 To 7
|
||||
Read n, p
|
||||
Print "Find solution for n ="; n; " and p =";p
|
||||
|
||||
If legendre_symbol(n, p) <> 1 Then
|
||||
Print n;" is not a quadratic residue"
|
||||
Print
|
||||
Continue For
|
||||
End If
|
||||
|
||||
If p = 2 OrElse Isprime(p, 15) = FALSE Then
|
||||
Print p;" is not a odd prime"
|
||||
Print
|
||||
Continue For
|
||||
End If
|
||||
|
||||
s = 0 : q = p -1
|
||||
Do
|
||||
s += 1
|
||||
q \= 2
|
||||
Loop Until (q And 1) = 1
|
||||
|
||||
If s = 1 And (p Mod 4) = 3 Then
|
||||
r = pow_mod(n, ((p +1) \ 4), p)
|
||||
Print "Solution found:"; r; " and"; p - r
|
||||
Print
|
||||
Continue For
|
||||
End If
|
||||
|
||||
z = 1
|
||||
Do
|
||||
z += 1
|
||||
Loop Until legendre_symbol(z, p) = -1
|
||||
c = pow_mod(z, q, p)
|
||||
r = pow_mod(n, (q +1) \ 2, p)
|
||||
t = pow_mod(n, q, p)
|
||||
m = s
|
||||
|
||||
Do
|
||||
i = 0
|
||||
If (t Mod p) = 1 Then
|
||||
Print "Solution found:"; r; " and"; p - r
|
||||
Print
|
||||
Continue For
|
||||
End If
|
||||
|
||||
Do
|
||||
i += 1
|
||||
If i >= m Then Continue For
|
||||
Loop Until pow_mod(t, 2 ^ i, p) = 1
|
||||
b = pow_mod(c, (2 ^ (m - i -1)), p)
|
||||
r = mul_mod(r, b, p)
|
||||
c = mul_mod(b, b, p)
|
||||
t = mul_mod(t, c, p)' t = t * b ^ 2
|
||||
m = i
|
||||
Loop
|
||||
|
||||
Next
|
||||
|
||||
Data 10, 13, 56, 101, 1030, 10009, 1032, 10009, 44402, 100049
|
||||
Data 665820697, 1000000009, 881398088036, 1000000000039
|
||||
|
||||
' empty keyboard buffer
|
||||
While InKey <> "" : Wend
|
||||
Print : Print "hit any key to end program"
|
||||
Sleep
|
||||
End
|
||||
|
|
@ -0,0 +1,131 @@
|
|||
' version 12-04-2017
|
||||
' compile with: fbc -s console
|
||||
|
||||
#Include Once "gmp.bi"
|
||||
|
||||
Data "10", "13", "56", "101", "1030", "10009", "1032", "10009"
|
||||
Data "44402", "100049", "665820697", "1000000009"
|
||||
Data "881398088036", "1000000000039"
|
||||
Data "41660815127637347468140745042827704103445750172002" ' p = 10^50 + 577
|
||||
|
||||
' ------=< MAIN >=------
|
||||
|
||||
Dim As uLong k
|
||||
Dim As ZString Ptr zstr
|
||||
Dim As String n_str, p_str
|
||||
|
||||
Dim As Mpz_ptr b, c, i, m, n, p, q, r, s, t, z, tmp
|
||||
b = Allocate(Len(__Mpz_struct)) : Mpz_init(b)
|
||||
c = Allocate(Len(__Mpz_struct)) : Mpz_init(c)
|
||||
i = Allocate(Len(__Mpz_struct)) : Mpz_init(i)
|
||||
m = Allocate(Len(__Mpz_struct)) : Mpz_init(m)
|
||||
n = Allocate(Len(__Mpz_struct)) : Mpz_init(n)
|
||||
p = Allocate(Len(__Mpz_struct)) : Mpz_init(p)
|
||||
q = Allocate(Len(__Mpz_struct)) : Mpz_init(q)
|
||||
r = Allocate(Len(__Mpz_struct)) : Mpz_init(r)
|
||||
s = Allocate(Len(__Mpz_struct)) : Mpz_init(s)
|
||||
t = Allocate(Len(__Mpz_struct)) : Mpz_init(t)
|
||||
z = Allocate(Len(__Mpz_struct)) : Mpz_init(z)
|
||||
tmp = Allocate(Len(__Mpz_struct)) : Mpz_init(tmp)
|
||||
|
||||
For k = 1 To 8
|
||||
Read n_str
|
||||
Mpz_set_str(n, n_str, 10)
|
||||
If k < 8 Then
|
||||
Read p_str
|
||||
Mpz_set_str(p, p_str, 10)
|
||||
Else
|
||||
p_str = "10^50 + 577"
|
||||
Mpz_set_str(p, "1" + String(50, "0"), 10)
|
||||
Mpz_add_ui(p, p, 577)
|
||||
End If
|
||||
|
||||
Print "Find solution for n = "; n_str; " and p = "; p_str
|
||||
|
||||
If Mpz_legendre(n, p) <> 1 Then
|
||||
Print n_str; " is not a quadratic residue"
|
||||
Print
|
||||
Continue For
|
||||
End If
|
||||
|
||||
If Mpz_tstbit(p, 0) = 0 OrElse Mpz_probab_prime_p(p, 20) = 0 Then
|
||||
Print p_str; "is not a odd prime"
|
||||
Print
|
||||
Continue For
|
||||
End If
|
||||
|
||||
Mpz_set_ui(s, 0) : Mpz_set(q, p) : Mpz_sub_ui(q, q, 1) ' q = p -1
|
||||
Do
|
||||
Mpz_add_ui(s, s, 1)
|
||||
Mpz_fdiv_q_2exp(q, q, 1)
|
||||
Loop Until Mpz_tstbit(q, 0) = 1
|
||||
|
||||
If Mpz_cmp_ui(s, 1) = 0 Then
|
||||
If Mpz_tstbit(p, 1) = 1 Then
|
||||
Mpz_add_ui(tmp, p, 1)
|
||||
Mpz_fdiv_q_2exp(tmp, tmp, 2) ' tmp = p +1 \ 4
|
||||
Mpz_powm(r, n, tmp, p)
|
||||
zstr = Mpz_get_str(0, 10, r)
|
||||
Print "Solution found: "; *zstr;
|
||||
Mpz_sub(r, p, r)
|
||||
zstr = Mpz_get_str(0, 10, r)
|
||||
Print " and "; *zstr
|
||||
Print
|
||||
Continue For
|
||||
End If
|
||||
End If
|
||||
|
||||
Mpz_set_ui(z, 1)
|
||||
Do
|
||||
Mpz_add_ui(z, z, 1)
|
||||
Loop Until Mpz_legendre(z, p) = -1
|
||||
Mpz_powm(c, z, q, p)
|
||||
Mpz_add_ui(tmp, q, 1)
|
||||
Mpz_fdiv_q_2exp(tmp, tmp, 1)
|
||||
Mpz_powm(r, n, tmp, p)
|
||||
Mpz_powm(t, n, q, p)
|
||||
Mpz_set(m, s)
|
||||
|
||||
Do
|
||||
Mpz_set_ui(i, 0)
|
||||
Mpz_mod(tmp, t, p)
|
||||
If Mpz_cmp_ui(tmp, 1) = 0 Then
|
||||
zstr = Mpz_get_str(0, 10, r)
|
||||
Print "Solution found: "; *zstr;
|
||||
Mpz_sub(r, p, r)
|
||||
zstr = Mpz_get_str(0, 10, r)
|
||||
Print " and "; *zstr
|
||||
Print
|
||||
Continue For
|
||||
End If
|
||||
|
||||
Mpz_set_ui(q, 1)
|
||||
Do
|
||||
Mpz_add_ui(i, i, 1)
|
||||
If Mpz_cmp(i, m) >= 0 Then
|
||||
Continue For
|
||||
end if
|
||||
Mpz_mul_ui(q, q, 2) ' q = 2^i
|
||||
Mpz_powm(tmp, t, q, p)
|
||||
Loop Until Mpz_cmp_ui(tmp, 1) = 0
|
||||
|
||||
Mpz_set_ui(q, 2)
|
||||
Mpz_sub(tmp, m, i) : Mpz_sub_ui(tmp, tmp, 1) : Mpz_powm(tmp, q, tmp, p)
|
||||
Mpz_powm(b, c, tmp, p)
|
||||
Mpz_mul(r, r, b) : Mpz_mod(r, r, p)
|
||||
Mpz_mul(tmp, b, b) : Mpz_mod(c, tmp, p)
|
||||
Mpz_mul(tmp, t, c) : Mpz_mod(t, tmp, p)
|
||||
Mpz_set(m, i)
|
||||
Loop
|
||||
|
||||
Next
|
||||
|
||||
Mpz_clear(b) : Mpz_clear(c) : Mpz_clear(i) : Mpz_clear(m)
|
||||
Mpz_clear(n) : Mpz_clear(p) : Mpz_clear(q) : Mpz_clear(r)
|
||||
Mpz_clear(s) : Mpz_clear(t) : Mpz_clear(z) : Mpz_clear(tmp)
|
||||
|
||||
' empty keyboard buffer
|
||||
While InKey <> "" : Wend
|
||||
Print : Print "hit any key to end program"
|
||||
Sleep
|
||||
End
|
||||
Loading…
Add table
Add a link
Reference in a new issue