# -*- coding:utf-8 -*-#欧几里得算法求最大公因数
a =eval(input("请输入一个数:"))
b =eval(input("请再次输入:"))
a =abs(a)
b =abs(b)print(a)if a < b :
a,b = b,a
r = a % b
while r :
a = b
b = r
r = a % b
print(b)#实现10000以内的素数表import math
deffunc(n):if n==2or n==3:return1;if n%6!=1and n%6!=5:return0;
tmp =int(math.sqrt(n))for i inrange(5,tmp+1,6):if n%i==0or n%(i+2)==0:return0;return1;
lis =[i for i inrange(2,10000)if1== func(i)]print(lis)#模平方法
b =eval(input("输入底数:"))
r =eval(input("输入指数: "))
m =eval(input("输入模: "))
a =1for i inrange(len(bin(r))-2):
n =int(bin(r)[-i-1])if n ==1:
a = a * b % m
b = b * b % m
else:
b = b * b % m
print(a)#RSA算法deffunc(m, n):sum=0for i inrange(1,m+1):if n%i==0and m%i ==0:sum+=1ifsum>1:return0else:return1
C =eval(input("请输入"))
e =eval(input("请输入"))
n =eval(input("请输入"))
f =0for i inrange(1,n):if func(i,n)==1:
f +=1print(f)sum,x,y =max(e, f), e, f
r =1for i inrange(1,sum):if x%i==0and y%i==0:
r = i
print(r)
a,b,c,d =1,0,0,1while x != r:if x < y:
x,y,a,c,b,d = y,x,c,a,d,b
x = x - y
a = a - c
b = b - d
m = C**a
m = m%n
print(m)
一次同余式
计算最大公因式
defjudge(a,m,b):if a < m :
a,m = m,a
r = a % m
while r :
a = m
m = r
r = a % m
#print(m)if b%m==0:return m
else:print("无解!")returnFalsedefEuclid(A, B, M, r):
a,b,m =int(A/r),int(B/r),int(M/r)#注意:尽管整除,但是有个小尾巴 .0#找特解for i inrange(1,m):if a*i%m==1or a*i%m==b:#放在一起是避免 b==1print(i)if a*i%m==b:
x = i
for i inrange(r-1):
x += m
print(x)if __name__ =="__main__":
A =eval(input("请输入x的系数:"))
B =eval(input("请输入x的余数:"))
M =eval(input("请输入X的模:"))
r = judge(A, B, M)if r !=False:
Euclid(A, B, M, r)
计算Legendre符号
搜索递归计算
defLegendre(a,b):if a ==1:return1if b % a ==0:return0if a %2==0:return Legendre(int(a/2),b)*(-1)**int((b**2-1)/8)return Legendre(b % a, a)*(-1)**int((a-1)*(b-1)/4)if __name__ =='__main__':for i inrange(10):
a =eval(input("请输入:"))
b =eval(input("请输入:"))print(Legendre(a,b))#计算重根import math
lis =[0for i inrange(55)]defjudge(num):
flag =Truefor i inrange(2,int((num**0.5))+1):if num % i ==0:
flag =Falsewhile num % i ==0:
lis[i]+=1
num =int(num/i)return flag
defEular(num):if judge(num):return num-1else:
ans = num
for i inrange(int((num**0.5)+1)):if lis[i]!=0:
ans =int(ans/i)*(i-1)return ans
defPow(a, b, mod):
ans,base =1,a%mod
while b!=0:if b &1:
ans = ans * base % mod
base =(base**2)% mod
b *=2return ans
if __name__=='__main__':
x =eval(input("请输入:"))
ans = Eular(x)for i inrange(1, x):for j inrange(1,ans+1):if Pow(i, j, x)==1:breakif j == ans:print(i)
/*#include<bits/stdc++.h>
using namespace std;
int ele[100000];
bool IsPrime(int num)
{
bool flag = true;
for(int i = 2; i <= sqrt(num); i++)
{
if(num % i == 0)
{
flag = false;
while(num % i == 0)
{
ele[i]++;
num /= i;
}
}
}
return flag;
}
int Euler(int num)
{
if(IsPrime(num))
return num-1;
else
{
int ans = num;
for(int i = 0; i <= sqrt(num); i++)
{
if(ele[i] != 0)
ans = (ans/i) * (i-1);
}
return ans;
}
}
int Pow(int a, int b, int mod)
{
int ans = 1, base = a%mod;
while(b != 0)
{
if(b & 1)
ans = (ans * base) % mod;
base = (base * base) % mod;
b >>= 1;
}
return ans;
}
int main()
{
int m;
while(scanf("%d", &m) != EOF)
{
int i, j;
int ans = Euler(m);
for(i = 1; i < m; i++)
{
for(j = 1; j <= ans; j++)
if(Pow(i, j, m) == 1)
break;
if(j == ans)
cout << i << endl;
}
}
return 0;
}
*/
/*
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
using namespace std;
int P;
const int NUM = 32170;
int prime[NUM/4];
bool f[NUM];
int pNum = 0;
void getPrime()//线性筛选素数
{
for (int i = 2; i < NUM; ++ i)
{
if (!f[i])
{
f[i] = 1;
prime[pNum++] = i;
}
for (int j = 0; j < pNum && i*prime[j] < NUM; ++ j)
{
f[i*prime[j]] = 1;
if (i%prime[j] == 0)
{
break;
}
}
}
}
__int64 getProduct(int a,int b,int P)//快速求次幂mod
{
__int64 ans = 1;
__int64 tmp = a;
while (b)
{
if (b&1)
{
ans = ans*tmp%P;
}
tmp = tmp*tmp%P;
b>>=1;
}
return ans;
}
bool judge(int num)//求num的所有的质因子
{
int elem[1000];
int elemNum = 0;
int k = P - 1;
for (int i = 0; i < pNum; ++ i)
{
bool flag = false;
while (!(k%prime[i]))
{
flag = true;
k /= prime[i];
}
if (flag)
{
elem[elemNum ++] = prime[i];
}
if (k==1)
{
break;
}
if (k/prime[i]<prime[i])
{
elem[elemNum ++] = prime[i];
break;
}
}
bool flag = true;
for (int i = 0; i < elemNum; ++ i)
{
if (getProduct(num,(P-1)/elem[i],P) == 1)
{
flag = false;
break;
}
}
return flag;
}
int main()
{
getPrime();
while (cin >> P)
{
for (int i = 2;;++i)
{
if (judge(i))
{
cout << i<< endl;
break;
}
}
}
return 0;
}
*/
#include<bits/stdc++.h>
using namespace std;
const int maxn = 500000;
bool vis[maxn] = {0};
int pri[maxn / 10] = {0};
int phi[maxn] = {0};
int n,k;
int temp[maxn] = {0};
int cnt = 0;
long long int res[maxn] = {0};
void init ()
{
for (int i = 2; i < maxn; ++ i)
{
if (!vis[i])
{
pri[cnt ++] = i;
for (int j = i + i; j < maxn; j += i)
{
vis[j] = 1;
}
}
}
phi[1] = 1;
memset (vis,0,sizeof (vis));
for (int i = 2; i < maxn; ++ i)
{
if (!vis[i])
{
for (int j = i; j < maxn; j += i)
{
vis[j] = 1;
if (phi[j] == 0)
phi[j] = j;
phi[j] = phi[j] / i * (i - 1);
}
}
}
}
void div (int n)
{
k = 0;
for (int i = 0; pri[i] * pri[i] <= n; ++ i)
{
if (n % pri[i] == 0)
{
temp[k ++] = pri[i];
while (n % pri[i] == 0)
n /= pri[i];
}
}
if (n > 1)
temp[k ++] = n;
}
long long lpow (long long a,long long b,long long m)
{
long long ans = 1;
a %= m;
while (b)
{
if (b & 1)
{
ans = ans * a % m;
b --;
}
b >>= 1;
a = a * a % m;
}
return ans % m;
}
bool check (int n)
{
if (n == 2 || n == 4)
return true;
if (n % 2 == 0)
n /= 2;
if (binary_search (pri + 1,pri + cnt,n))
return true;
for (int i = 1; i < cnt && pri[i] * pri[i] <= n; ++ i)
{
if (n % pri[i] == 0)
{
while (n % pri[i] == 0)
{
n /= pri[i];
}
if (n == 1)
return true;
break;
}
}
return false;
}
int main ()
{
init ();
while (scanf ("%d",&n) != EOF)
{
if (n == 2)
{
printf ("1\n");
continue ;
}
if (check(n) == 0)
{
printf ("-1\n");
continue;
}
int tot = 0;
int p = phi[n];
div (p);
for (int q = 2; q < n; ++ q)
{
if (__gcd (q,n) != 1)
continue;
int flag = 1;
for (int i = 0; i < k; ++ i)
{
int t = p / temp[i];
if (lpow(q, t, n) % n == 1)
{
flag = 0;
break;
}
}
if(flag)
{
res[tot ++] = q;
break;
}
}
long long int cc = res[0];
tot = 0;
for (int i = 1; i < p; ++ i)
{
if (__gcd (i,p) == 1)
{
res[tot ++] = cc;
}
cc = cc * res[0] % n;
}
sort (res,res + tot);
if (tot)
{
printf ("%lld",res[0]);
for (int i = 1; i < tot; ++ i)
{
printf (" %lld",res[i]);
}
}
else
{
printf ("-1");
}
printf ("\n");
}
return 0;
}
#欧几里得算法求最大公因数a = eval(input("请输入一个数:"))b = eval(input("请再次输入:"))a = abs(a)b = abs(b)print(a)if a < b : a,b = b,ar = a % bwhile r : a = b b = r r = a % bprint(b)#实现10000以内...