二次剩余求的是这个东西

如果给定x,再给定若干个大的质数p,如果结果a相同,那么x是完全平方数?

 /*poj 1808
题意:
判断平方剩余,即判断(x^2)%p=a是否有解。
限制:
|a| <= 1e9 && a % p !=0; 2 < p < 1e9 && p为奇素数。
思路:
用欧拉准则计算勒让德符号(用来判断平方剩余)
*/
#include<iostream>
#include<cstdio>
using namespace std;
#define LL __int64
LL a_b_MOD_c(LL a,LL b,LL mod){
LL ret = ;
a %= mod;
while(b){
if(b & ) ret = ret * a % mod;
a = a * a % mod;
b >>= ;
}
return ret;
}
//(x^2)%n=a 求平方剩余,n必须是奇素数
//注意:如果a为负,则看题意,是否要化为a=(a%n+n)%n
int modsqr(int a,int n){
int b,k,i,x;
if(n==) return a%n;
if(a_b_MOD_c(a,(n-)/,n)==){
if(n%==)
x=a_b_MOD_c(a,(n+)/,n);
else{
for(b=;a_b_MOD_c(b,(n-)/,n)==;b++){
i=(n-)/;
k=;
}
do{
i/=;
k/=;
if((a_b_MOD_c(a,i,n)*a_b_MOD_c(b,k,n)+)%n==)
k+=(n-)/;
}
while(i%==);
x=(a_b_MOD_c(a,(i+)/,n)*a_b_MOD_c(b,k/,n))%n;
}
if(x*>n)
x=n-x;
return x;
}
return -;
}
//用欧拉准则计算勒让德符号(用来判断平方剩余)
//表示为(a|p) a为整数,p为奇素数(所以m=2不适用勒让德符号),有三种情况。
//1. (a|p)=0, if(a%p==0)
//2. (a|p)=1, if(a%p!=0 && (x^2)%p=a 有整数解)
//3. (a|p)=-1,if((x^2)%p=a 无整数解)
//注意:如果a为负,则看题意,是否要化为a=(a%p+p)%p
int lrd(LL a,LL p){
LL ret=a_b_MOD_c(a,(p-)>>,p);
if(ret==)
return ;
return -;
}
int main(){
int T,cas=;
int a,n;
scanf("%d",&T);
while(T--){
scanf("%d%d",&a,&n);
a=(a+n)%n; //以后注意给出余数的时候,要注意它是不是负的 //求平方剩余
//cout<<modsqr(a,n)<<endl;
printf("Scenario #%d:\n%d\n\n",++cas,lrd(a,n));
}
return ;
}

然后是n次剩余

 /*hdu 3930
题意:
给定newx, k, m, 方程 (x^k)%m=newx, 求在模m意义下的所有解x。
限制:
0 <= newx, m, k <= 1.5*10^15; m是素数。
思路:
N次剩余
*/
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;
#define LL __int64
#define PB push_back
LL mul(LL a,LL b,LL m){
LL ret = ;
a %= m;
while(b){
if(b & ) ret = (ret + a) % m;
a = (a + a) % m;
b >>= ;
}
return ret;
}
LL a_b_MOD_c(LL a,LL b,LL m){
LL ret = ;
a %= m;
while(b){
if(b&) ret = mul(ret,a,m);
a = mul(a,a,m);
b >>= ;
}
return ret;
} LL ext_gcd(LL a,LL b,LL &x,LL &y){
if(b==) { x=, y=; return a; }
LL ret= ext_gcd(b,a%b,y,x);
y-= a/b*x;
return ret;
}
vector<LL> a;
bool g_test(LL g,LL p){
for(LL i=;i<a.size();++i)
if(a_b_MOD_c(g,(p-)/a[i],p)==)
return ;
return ;
}
LL pri_root(LL p){
a.clear();
LL tmp=p-;
for(LL i=;i<=tmp/i;++i)
if(tmp%i==){
a.push_back(i);
while(tmp%i==)
tmp/=i;
}
if(tmp!=)
a.push_back(tmp);
LL g=;
while(true){
if(g_test(g,p))
return g;
++g;
}
}
const int HASH_MOD=;
LL key[HASH_MOD], val[HASH_MOD];
int head[HASH_MOD], next[HASH_MOD];
struct Hash{
int tot;
void init(){
memset(head, -, sizeof(head));
tot = ;
}
LL insert(LL x, LL y){
int k = x % HASH_MOD;
key[tot] = x;
val[tot] = y;
next[tot] = head[k];
head[k] = tot++;
}
LL find(LL x){
int k = x % HASH_MOD;
for(int i = head[k]; i != -; i = next[i])
if(key[i] == x)
return val[i];
return -;
}
}hs;
//求解模方程a^x=b(mod m),n为素数,无解返回-1
//注意:要求0 < a < m; 0 <= b < m; 否则按题意自己转化。
//复杂度O(sqrt(m))
LL log_mod(LL a, LL b, LL m){
hs.init();
LL s = ceil(sqrt(m + 0.5));
LL cur = ;
for (int i = ; i < s; ++i){
if(hs.find(cur)==-) hs.insert(cur,i); //记得先判重,在插入
cur = cur * a % m;
} LL v = a_b_MOD_c(a, (m - s - + m) % m, m);
for(int i = ; i < s; ++i){
LL tmp = hs.find(b);
if(tmp!=-)
return s * i + tmp;
b=b*v%m;
}
return -;
}
/*n次剩余
任务:
给定N, a, p, 求出(x^N)%p=a 在模p意义下的所有解x。
说明:
令g为p的原根,因为p为素数,所以phi(p)=p-1。
由原根的性质得:
如果g为p的原根,则:g^i mod p != g^j mod p (p为素数), 其中i != j且i, j介於1至(p-1)之间
所以,可以设g^y=x, g^t=a,则有:
g^(y*N)%p=g^t
又由原根的性质:
g^(y*N)%p=g^t -> (y*N)%(p-1)=t (此方程可以由拓展欧几里得解)
另外g^t=a可以由离散对数求出
*/
vector<LL> residue(LL p, LL N, LL a){
LL g = pri_root(p);
g %= p;
LL m = log_mod(g, a, p);
vector<LL> ret;
if(a == ){
ret.PB();
return ret;
}
if(m == -)
return ret;
LL A = N, B = p - , C = m, x, y;
LL d = ext_gcd(A, B, x, y);
if(C % d != ) return ret;
x = x * (C / d) % B;
LL delta = B / d;
for(int i = ; i < d; ++i){
x = ((x + delta) % B + B) % B;
ret.PB(a_b_MOD_c(g, x, p));
}
sort(ret.begin(), ret.end());
ret.erase(unique(ret.begin(), ret.end()), ret.end());
return ret;
}
int main(){
int cas = ;
LL k,m,newx;
while(scanf("%I64d%I64d%I64d",&k, &m, &newx)!=EOF){
vector<LL> ans;
ans = residue(m,k,newx);
printf("case%d:\n",++cas);
if(ans.size()==) puts("-1");
for(int i = ; i < ans.size(); ++i)
printf("%I64d\n",ans[i]);
}
return ;
}

数学:二次剩余与n次剩余的更多相关文章

  1. 二次剩余、三次剩余、k次剩余

    今天研究了一下这块内容...首先是板子 #include <iostream> #include <stdio.h> #include <math.h> #incl ...

  2. N次剩余和二次剩余

    N次剩余 给定 \(N,a,P\),且 \(P\) 最好为质数 可以算出 \(x^N\equiv a(mod~p)\) 的解 首先可以算出 \(P\) 的原根 \(g\) 解方程 \(g^y\equi ...

  3. 数学杂烩总结(多项式/形式幂级数+FWT+特征多项式+生成函数+斯特林数+二次剩余+单位根反演+置换群)

    数学杂烩总结(多项式/形式幂级数+FWT+特征多项式+生成函数+斯特林数+二次剩余+单位根反演+置换群) 因为不会做目录所以请善用ctrl+F 本来想的是笔记之类的,写着写着就变成了资源整理 一些有的 ...

  4. ACM数学

     1.burnside定理,polya计数法 这个专题我单独写了个小结,大家可以简单参考一下:polya 计数法,burnside定理小结 2.置换,置换的运算 置换的概念还是比较好理解的,< ...

  5. OI数学汇总

    最前面:\(\LaTeX\)可能需要加载一会,请耐心等待o~ 前言 数学在\(\text{OI}\)中十分重要.其中大多都是数论. 什么是数论? \[ 研究整数的理论 --zzq \] 本文包含所有侧 ...

  6. RSA加密数学原理

    RSA加密数学原理 */--> *///--> *///--> UP | HOME RSA加密数学原理 Table of Contents 1 引言 2 RSA加密解密过程 2.1 ...

  7. codeforces 687B - Remainders Game 数学相关(互质中国剩余定理)

    题意:给你x%ci=bi(x未知),是否能确定x%k的值(k已知) ——数学相关知识: 首先:我们知道一些事情,对于k,假设有ci%k==0,那么一定能确定x%k的值,比如k=5和ci=20,知道x% ...

  8. [HNOI 2013] 旅行 (数学)

    感觉此题难啊,数学还是太渣了,看了半天的题解才算明白了点儿. 题目大意 给一个长度为n且仅由1和-1组成的序列ai, i = 1, 2, ..., n,每个位置都有另一个值vi,要求用某种方案将序列划 ...

  9. POJ 2359 Questions(约瑟夫环——数学解法)

    题目链接: http://poj.org/problem?id=2359 题意描述: 输入一个字符串 按照下面的规则,如果剩下的最后一个字符是'?',输出"Yes",如果剩下的最后 ...

随机推荐

  1. .Net Core 分布式微服务框架 - Jimu 添加 Swagger 支持

    系列文章 .Net Core 分布式微服务框架介绍 - Jimu .Net Core 分布式微服务框架 - Jimu 添加 Swagger 支持 一.前言 最近有空就优化 Jimu (一个基于.Net ...

  2. unity2D背景移动补偿从而获得3d错觉效果

    2d平台跳跃游戏当相机移动的时候背景跟随进行微调移动,从而使得玩家获得3d的错觉 using System.Collections;using System.Collections.Generic;u ...

  3. 如何在unity中使用龙骨动画

    龙骨 龙骨是Egret公司的一个用来做动画的软件,本文分享一下如何在Unity2D中使用龙骨导出的2D动画 导出动画 在龙骨中文件->导出,导出动画数据和纹理到Unity的项目中,如果打包了的话 ...

  4. PAT甲题题解-1039. Course List for Student (25)-建立映射+vector

    博主欢迎转载,但请给出本文链接,我尊重你,你尊重我,谢谢~http://www.cnblogs.com/chenxiwenruo/p/6789157.html特别不喜欢那些随便转载别人的原创文章又不给 ...

  5. 《LINUX内核设计与实现》第五章学习总结

    一.与内核通信 系统调用:用户控件进程和硬件设备之间添加了一个中间层 系统调用的三个主要作用: 为用户空间提供了一种硬件的抽象接口 系统调用保证了系统的稳定和安全 每个进程都运行在虚拟系统中,而在用户 ...

  6. 第二阶段Sprint9

    昨天:重新规划主界面,把视频录制暂放到主页面里 今天:查看有关“共享平台”的资料,看如何实现上传下载功能,并尝试编码, 遇到的问题:看不懂什么意思,照例子做不行,还得需要联网等

  7. Daily Scrum - 11/16

    时间:午饭 今天小组例会主要是汇报了各自的进度.任烁那边主要为工程添加了单词的类(包含各个参数等成员变量),方便以后实现算法:拜重阳实现了一个简易的“点进-点出”UI,可谓迈出了艰难的第一步:章玮和罗 ...

  8. 团队冲刺随笔合集—Beta阶段

    第一篇:http://www.cnblogs.com/Team-Blog/p/9049271.html 第二篇:https://www.cnblogs.com/Team-Blog/p/9064478. ...

  9. 团队伊始——DreamCatcher

    我们的团队,队名是DreamCatcher,中文意思是追梦人,它是一首歌曲,所属专辑是<新世纪的曙光>. 这是一首很好听的歌曲,里面有一句歌词是: I'm a dream catcher ...

  10. beta yz 5

    031602111 傅海涛 1.今天进展 接口微调修正 2.存在问题 文档转化太久 3.明天安排 完成全部接口的交互 4.心得体会 文档转化需要好好优化 031602115 黄家雄 1.界面优化 2. ...