[信安數基] 二次剩餘

膜重複平方計算+歐拉判別條件

#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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章