【二次剩餘-歐拉準則】HDOJ Jacobi symbol 3589



Jacobi symbol

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 549    Accepted Submission(s): 207


Problem Description
Consider a prime number p and an integer a !≡ 0 (mod p). Then a is called a quadratic residue mod p if there is an integer x such that x2 ≡ a (mod p), and a quadratic non residue otherwise. Lagrange introduced the following notation, called the Legendre symbol, L (a,p): 



For the calculation of these symbol there are the following rules, valid only for distinct odd prime numbers p, q and integers a, b not divisible by p: 



The Jacobi symbol, J (a, n) ,is a generalization of the Legendre symbol ,L (a, p).It defines as :
1.  J (a, n) is only defined when n is an odd.
2.  J (0, n) = 0.
3.  If n is a prime number, J (a, n) = L(a, n).
4.  If n is not a prime number, J (a, n) = J (a, p1) *J (a, p2)…* J (a, pm), p1…pm is the prime factor of n.
 

Input
Two integer a and n, 2 < a< =106,2 < n < =106,n is an odd number.
 

Output
Output J (a,n)
 

Sample Input
3 5 3 9 3 13
 

Sample Output
-1 0 1
 

Author
alpc41
 

Source
 

Recommend
zhouzeyong   |   We have carefully selected several similar problems for you:  3583 3590 3588 3587 3586 
 


題意:

求J(a,n)

解題思路:

二次剩餘,歐拉準則!

數論中,特別在同餘理論裏,一個整數 X 對另一個整數 p 的二次剩餘英語Quadratic residue)指 X 的平方 X^2 除以 p 得到的餘數

當對於某個d及某個X,式子 X^2 \equiv d \pmod{p} 成立時,稱d是模p的二次剩餘”

當對於某個d及某個XX^2 \equiv d \pmod{p} 不成立時,稱d是模p的二次非剩餘”

  歐拉準則:

p是奇質數p不能整除d,則:

d是模p的二次剩餘當且僅當

d^{ \frac{p-1}{2}} \equiv 1 \pmod{p}

d是模p的非二次剩餘當且僅當:

d^{ \frac{p-1}{2}} \equiv -1 \pmod{p}

勒讓德符號表示,即爲: d^{ \frac{p-1}{2}} \equiv \left( \frac{d}{p}\right) \pmod{p}

AC代碼:

#include <stdio.h>
#include <string.h>
#include <algorithm>

using namespace std;

const int MAXN = 1000000+10;
typedef long long LL;

bool is_prime[MAXN];
int prime[MAXN];

void init()
{
    int tot=0;
    is_prime[0]=is_prime[1]=true;
    for(int i=2;i<MAXN;i++){
        if(!is_prime[i]){
            prime[tot++]=i;
            for(int j=i+i;j<MAXN;j+=i){
                is_prime[j]=true;
            }
        }
    }
}

int fast_power(int a,int n,int M)
{
    LL res=1;
    LL x=a;
    while(n){
        if(n&1) res=res*x%M;
        x=x*x%M;
        n>>=1;
    }
    return res%M;
}

int solve(int a,int p)
{
    if(a%p==0) return 0;
    return fast_power(a,(p-1)/2,p)==1?1:-1;
}

int main ()
{
    int a,n;
    init();
    while(scanf("%d%d",&a,&n)!=EOF){
        int ans=1;
        if(is_prime[n]){
            for(int i=0;prime[i]<=n;i++){
                if(n%prime[i]) continue;
                int cnt=0;
                while(n%prime[i]==0){
                    n/=prime[i];
                    cnt++;
                }
                int t=solve(a,prime[i]);
                if(t==-1&&cnt%2==0) t=1;
                ans*=t;
            }
        }
        else ans=solve(a,n);
        printf("%d\n",ans);
    }
    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章