平方剩余

平方剩余

POJ:1808

链接:http://poj.org/problem?id=1808

题意:给定a,n(n为质数) 问 x^2 ≡ a (mod n) 是否有解

   可以用a^((n - 1)/2) ≡ ±1(mod n) 当为1是二次剩余,为-1是非二次剩余

但上述方法仅仅是判断是否有解,下面的方法能够求最小整数解

Ural(Timus) 1132

链接: http://acm.timus.ru/problem.aspx?space=1&num=1132

题意:给定a,n(n为质数) 问 x^2 ≡ a (mod n) 是否有解,如果有解按照从小到大输出解

代码:

typedef long long ll;
using namespace std;
ll pow_mod(ll a, ll n, ll p) {
    ll res = 1;
    while (n) {
        if (n & 1) res = res * a % p;
        n >>= 1;
        a = a * a % p;
    }
    return res;
}
ll legendre(ll a, ll p) {
    return pow_mod(a, (p - 1) >> 1, p);
}
ll mod(ll a, ll p) {
    a %= p;
    if (a < 0) a += p;
    return a;
}
struct node {
    static ll p, omega;
    ll a, b;
    node(ll a, ll b): a(a % p), b(b % p) {}
};
node operator *(const node &p, const node &q) {
    int m = node::p;
    return node(p.a * q.a + p.b * q.b % m * node::omega,
                       p.a * q.b + q.a * p.b);
}
node pow_mod(node a, ll n) {
    node result(1, 0);
    while (n > 0) {
        if ((n & 1) == 1) {
            result = result * a;
        }
        a = a * a;
        n >>= 1;
    }
    return result;
}
ll node::p, node::omega;
ll modsqr(ll a, ll p) {
    if (p == 2) return 1;
    if (legendre(a, p) + 1 == p) return -1;
    if ((((p + 1) >> 1) & 1) == 0) return pow_mod(a, (p + 1) >> 2, p);
    ll a_0 = -1;
    while (true) {
        a_0 = rand() % p;
        if (legendre(mod(a_0 * a_0 - a, p), p) + 1 == p) break;
    }
    node::p = p;
    node::omega = mod(a_0 * a_0 - a, p);
    node ret = pow_mod(node(a_0, 1), (p + 1) >> 1);
    //assert(ret.b == 0);
    return ret.a;
}
int main () {
    int t;
    int a, n;
    scanf("%d", &t);
    while(t--) {
        scanf("%d%d", &a, &n);
        a %= n;
        int x = modsqr(a, n);
        if (x == -1) puts("No root");
        else {
            if (x * 2 > n) x = n - x;
            if (x != n - x) printf("%d %d\n", x, n - x);
            else printf("%d\n", x);
        }
    }
    return 0;
}

平方剩余,布布扣,bubuko.com

时间: 2024-12-12 22:43:09

平方剩余的相关文章

poj 1808 Quadratic Residues 【平方剩余】【数论】

题目链接:http://poj.org/problem?id=1808 题目大意:给你T组数据,每组数据一个a一个n,判断 x^2  ≡  a ( mod  n ) 能否成立.成立则输出1否则输出-1. 一个简单的平方剩余,只用判断能否有解即可. #include<stdio.h> #define LL long long LL pow_mod(LL a, LL n, LL mod) { LL res = 1; while(n) { if (n & 1) res = res * a %

POJ 1808 + Ural 1132 平方剩余

链接:http://poj.org/problem?id=1808 http://acm.timus.ru/problem.aspx?space=1&num=1132 题意:两道题都是模板题,第一个是判断是否有平方剩余,第二个是计算平方剩余. 思路:平方剩余就是给定a,n(n为质数) 问 x^2 ≡ a (mod n) 是否有解,可以用a^((n - 1)/2) ≡ ±1(mod n) 当为1是二次剩余,为-1是非二次剩余. 资料:http://blog.csdn.net/acdreamers/

NEU 1440 The minimum square sum (平方剩余和欧拉准则)

若p=2或p=4*k+1 则p可以表成两平方数的和的形式 (欧拉和费马已证明,并且有求的方法) 所以答案是p 若p=4*k+3 设a^2=n(mod p) (n!=0)  可以证明不存在b,b^2=p-n(mod p) 即若n是p的平方剩余 则p-n不是p的平方剩余 证明:因为a^2=n(mod p) 所以由欧拉准则 得n^((p-1)/2)=1(mod p) 若b^2=-n(mod p) 那么(-n)^((p-1)/2)=1(mod p) 左边把符号提出来 得(-1)^((p-1)/2)*n^

平方剩余 (poj 1808)

题意: 判断平方剩余,即判断(x^2)%p=a是否有解. 限制: |a| <= 1e9 && a % p !=0; 2 < p < 1e9 && p为奇素数. 思路: 用欧拉准则计算勒让德符号(用来判断平方剩余) 代码,内含求平方剩余的解函数

勒让德符号相关

小西瓜最近学了这个东西,并不很懂,就想敲篇日志巩固一下……     勒让德符号嘛,很有趣(本句扯淡),它呢,跟平方剩余有关:设a,b是两个非零整数,b为素数,我们定义符号:若存在整数x, 使得,那么就记; 否则就记. 当p|a时,=0.(这符号敲起来有点麻烦诶,为方便,下面用(a\b)表示,方向与除号相反) 一些性质: 首先,由欧拉判别条件,显然有(a\b)≡a^((b-1)/2)(mod b) 若a1≡a2 那么(a1\p)=(a2\p),证明显然,套下欧拉判别条件就行.      显然……(

密码学_椭圆曲线

取p=29,求出椭圆曲线y^2=x^3+4x+20的全部解点 用穷举法求椭圆曲线 第一步:列表,求出0~28(0<=i<p)关于等式x^3+4x+20 mod29  的结果 可用程序完成此步骤: 代码如下: #include<stdio.h>int main(){int i,y,z; printf("x x^3+4*x+20 \n"); for (i = 0; i < 29; i++) { y = i*i*i + 4 * i + 20; z = y % 2

code lib map

1. ACM算法 1. 数学 1 矩阵 1.1 矩阵类 1.2 Gauss消元 1.3 矩阵的逆 1.4 常系数线性齐次递推 2 整除与剩余 2.1 欧几里得算法 2.2 扩展欧几里得 2.3 单变元模线性方程 2.4 中国剩余定理 2.5 求原根 2.6 平方剩余 2.7 离散对数 2.8 N次剩余 3 素数与函数 3.1 素数筛法 3.2 素数判定 3.3 质因数分解 3.4 欧拉函数计算 3.5 Mobius函数计算 4 数值计算 4.1 数值积分 4.2 高阶代数方程求根 5 其他 5.

POJ 2420 模拟退火

链接: http://poj.org/problem?id=2420 题意: 给出n个点,找到一个点,使得它到所有的点的距离最小. 题解: 最近要做一个排课系统,需要用到模拟退火算法,之前虽然了解过这个算法,但是没有写过题.就先在POJ上找了一道学习一下. 代码: 1 #include <iomanip> 2 struct Point { double x, y; }; 3 4 const double eps = 1e-8; //搜索条件阀值 5 const double T = 100;

@算法 - [email&#160;protected] 牛顿迭代法的应用——多项式开方,对数,指数,三角与幂函数

目录 @0 - 参考资料@ @0.5 - 多项式平方根@ @1 - 牛顿迭代法@ @数学上的定义@ @对于多项式的定义@ @2 - 牛顿迭代的应用@ @重新推导 - 多项式逆元@ @重新推导 - 多项式平方根@ @多项式对数函数@ @多项式指数函数@ @多项式幂函数@ @多项式三角函数@ @3 - 一些参考代码@(留坑待填) @4 - 算法应用@(留坑待填) @0 - 参考资料@ Miskcoo's Space 的讲解 Picks 的讲解 @0.5 - 多项式平方根@ 已知一个多项式 \(A(x