膜重複平方計算+歐拉判別條件
#include<iostream>
#include<cmath>
using namespace std;
int square(int x) {
return x * x;
}
int fastMod(int x, int n, int m)
{
if (n == 0)
return 1;
else if (n % 2 == 0)
return square(fastMod(x, n / 2, m)) % m;
else
return x * fastMod(x, n - 1, m) % m;
}
int main(){
int p;//要求的數
int y;
while(cin>>p){
int *arr = new int[p]();
for(int i = 1; i < p; i ++) arr[i] = 0;
cout<<p<<"'s :Quadratic residue:"<<endl;
y = (p - 1)/ 2;
for(int i = 1; i < p; i ++)
if(fastMod(i, y, p) == 1) {
arr[i] = 1;
cout<<i<<' ';
}
cout<<endl<<p<<"'s :Quadratic non-residue:"<<endl;
for(int i = 1; i < p; i ++) {
if(arr[i] == 0)
cout<<i<<' ';
}
cout<<endl;
}
return 0;
}