二次剩余定义:

在维基百科中,是这样说的:如果q等于一个数的平方模 n,则q为模 n 意义下的二次剩余。例如:x2≡n(mod p)。否则,则q为模n意义下的二次非剩余。

Cipolla算法:一个解决二次剩余强有力的工具,用来求得上式的x的一个算法。

需要学习的数论及数学基础:勒让德符号欧拉判别准则复数运算

勒让德符号:判断n是否为p的二次剩余,p为奇质数。

欧拉定理为xφ(p)≡1(mod p)

当p为素数时,可知φ(p)=p-1,转化为xp-1≡1(mod p)

开根号后为 x(p1)/2≡±1(mod p),如果等于1就肯定开的了方,为-1一定开不了。所以x是否为n的二次剩余就用这个欧拉判别准则。

qpow(n,(mod-)>>)==mod-

随机找数a,使得a2−n为复数的虚数单位的平方,即

随机一个数a,然后对a2−n进行开方操作(就是计算他勒让德符号的值),直到他们的勒让德符号为-1为止(就是开不了方为止)。 就是找到一个a满足(a2−n)(p1)/2=−1。

    LL a=;
while(qpow((a*a-n+mod)%mod,(mod-)>>)!=mod-) a=rand()%mod;

建立复数乘法运算((a+bi)(c+di)=(ac+bd*(-1))+(bc+ad)i)

建立一个类似的域,前面寻找了一个a使(a2−n)(p1)/2=−1,所以我们定义ω=√(a2−n)。那么现在的ω也像i一样,满足ω2=a2−n=-1

node two(node a,node b)//复数相乘
{
node ans;
ans.x=(a.x*b.x%mod+a.y*b.y%mod*w%mod)%mod;
ans.y=(a.x*b.y%mod+a.y*b.x%mod)%mod;
return ans;
}

答案=(a+ω)(p+1)/2

根据拉格朗日定理,可以得出虚数处的系数一定为0。

 node q_pow(node a,LL b){
node res;
res.x=,res.y=;
while(b){
if(b&)res=two(res,a);
a=two(a,a);
b>>=;
}
return res;
}
     node p;
p.x=a,p.y=,w=(a*a-n+mod)%mod;
node ans=q_pow(p,(mod+)>>);
return ans.x;

2019牛客多校训练营第九场B题为Cipolla算法模板题

 #include<bits/stdc++.h>
#define LL long long
using namespace std;
const LL mod=1e9+;
struct node
{
LL x,y;
};
LL w;
node two(node a,node b)//复数相乘
{
node ans;
ans.x=(a.x*b.x%mod+a.y*b.y%mod*w%mod)%mod;
ans.y=(a.x*b.y%mod+a.y*b.x%mod)%mod;
return ans;
}
node q_pow(node a,LL b)
{
node res;
res.x=,res.y=;
while(b)
{
if(b&)
res=two(res,a);
a=two(a,a);
b>>=;
}
return res;
}
LL qpow(LL a,LL b)
{
LL ans=;
a%=mod;
while(b)
{
if(b&)
ans=ans*a%mod;
a=a*a%mod,b>>=;
}
return ans;
}
LL solve(LL n)
{
if(qpow(n,(mod-)>>)==mod-)//勒让德符号
return -;
else if(n==)
return ;
LL a=;//找随机a
while(qpow((a*a-n+mod)%mod,(mod-)>>)!=mod-)//勒让德符号
a=rand()%mod;
node p;
p.x=a,p.y=,w=(a*a-n+mod)%mod;
node ans=q_pow(p,(mod+)>>);//求出答案
return ans.x;
}
int main()
{
int T;
scanf("%d",&T);
LL q,b,n,x,y,c,t=qpow(,mod-);
while(T--)
{
scanf("%lld%lld",&b,&c);
q=(b*b-*c+mod)%mod;
n=solve(q);
if(n==-)
{
printf("-1 -1\n");
continue;
}
x=((b+n)%mod)*t%mod,y=(b-x+mod)%mod;
if(x>y)
swap(x,y);
printf("%lld %lld\n",x,y);
}
return ;
}

二次剩余定理及Cipolla算法入门到自闭的更多相关文章

  1. 二次剩余Cipolla算法学习笔记

    对于同余式 \[x^2 \equiv n \pmod p\] 若对于给定的\(n, P\),存在\(x\)满足上面的式子,则乘\(n\)在模\(p\)意义下是二次剩余,否则为非二次剩余 我们需要计算的 ...

  2. Cipolla算法学习小记

    转自:http://blog.csdn.net/doyouseeman/article/details/52033204 简介 Cipolla算法是解决二次剩余强有力的工具,一个脑洞大开的算法. 认真 ...

  3. 贝叶斯公式由浅入深大讲解—AI基础算法入门

    1 贝叶斯方法 长久以来,人们对一件事情发生或不发生的概率,只有固定的0和1,即要么发生,要么不发生,从来不会去考虑某件事情发生的概率有多大,不发生的概率又是多大.而且概率虽然未知,但最起码是一个确定 ...

  4. 贝叶斯公式由浅入深大讲解—AI基础算法入门【转】

    本文转载自:https://www.cnblogs.com/zhoulujun/p/8893393.html 1 贝叶斯方法 长久以来,人们对一件事情发生或不发生的概率,只有固定的0和1,即要么发生, ...

  5. Cipolla算法学习笔记

    学习了一下1个$\log$的二次剩余.然后来水一篇博客. 当$p$为奇素数的时候,并且$(n, p) \equiv 1 \pmod{p}$,用Cipolla算法求出$x^2 \equiv n \pmo ...

  6. URAL 1132 Square Root(二次剩余定理)题解

    题意: 求\(x^2 \equiv a \mod p\) 的所有整数解 思路: 二次剩余定理求解. 参考: 二次剩余Cipolla's algorithm学习笔记 板子: //二次剩余,p是奇质数 l ...

  7. 【转】 SVM算法入门

    课程文本分类project SVM算法入门 转自:http://www.blogjava.net/zhenandaci/category/31868.html (一)SVM的简介 支持向量机(Supp ...

  8. 三角函数计算,Cordic 算法入门

    [-] 三角函数计算Cordic 算法入门 从二分查找法说起 减少乘法运算 消除乘法运算 三角函数计算,Cordic 算法入门 三角函数的计算是个复杂的主题,有计算机之前,人们通常通过查找三角函数表来 ...

  9. 循环冗余校验(CRC)算法入门引导

    目录 写给嵌入式程序员的循环冗余校验CRC算法入门引导 前言 从奇偶校验说起 累加和校验 初识 CRC 算法 CRC算法的编程实现 前言 CRC校验(循环冗余校验)是数据通讯中最常采用的校验方式.在嵌 ...

随机推荐

  1. WinDbg常用命令系列---日志操作相关命令log*

    .logopen (Open Log File) .logopen命令将事件和命令的副本从调试器命令窗口发送到新的日志文件. .logopen [Options] [FileName] .logope ...

  2. [PA2012]Dwa torty

    [PA2012]Dwa torty 题目大意: 给定两个排列\(A_{1\sim n},B_{1\sim n}\),你需要将两个排列用最少的次数消除. 消除只能从头消除,一次消除可以从两个排列的头部取 ...

  3. 洛谷 P1351 联合权值 题解

    P1351 联合权值 题目描述 无向连通图 \(G\) 有 \(n\) 个点,\(n-1\) 条边.点从 \(1\) 到 \(n\) 依次编号,编号为 \(i\) 的点的权值为 \(W_i\)​,每条 ...

  4. 2017.10.4 国庆清北 D4T2 正方形

    题目描述 在一个10000*10000的二维平面上,有n颗糖果. LYK喜欢吃糖果!并且它给自己立了规定,一定要吃其中的至少C颗糖果! 事与愿违,LYK只被允许圈出一个正方形,它只能吃在正方形里面的糖 ...

  5. P5110 【块速递推】

    太菜了,不会生成函数,于是用特征方程来写的这道题 首先我们知道,形如\(a_n=A*a_{n-1}+B*a_{n-2}\)的特征方程为\(x^2=A*x+B\) 于是此题的递推式就是:\(x^2=23 ...

  6. CF1221G Graph And Numbers(折半搜索+图论)

    答案=总数-无0-无1-无2+无01+无02+无12-无012 直接详细讲无0和无2 无0为 01和11,无2为01和00,显然二者方案数相同,以下考虑无0 考虑折半搜索,后半段搜索,二进制点权0的位 ...

  7. 开源一个golang小程序商城后台系统(moshopserver)

    开源一个golang小程序商城后台(moshopserver) golang和c/c++比起来是一门新的语言,一直想学,网上搜集了一些资料,有些人说很容易上手,确实是这样,和C/C++比起来,少了很多 ...

  8. Don't always upset yourself !

  9. 设置应用程序的样式并对其进行部署——《Python编程从入门到实践》

    我们将使用应用程序django-bootstrap3为Web应用程序设计样式.我们将把项目"学习笔记"部署到Heroku,这个网站能让我们们将项目推送到其服务器,让任何有网络连接的 ...

  10. 第06组 Beta冲刺(3/4)

    队名:福大帮 组长博客链接: 作业博客 : https://edu.cnblogs.com/campus/fzu/SoftwareEngineeringClassAofFuzhouUniversity ...