首页 > 其他分享 >二次剩余模板简记

二次剩余模板简记

时间:2024-01-17 15:13:32浏览次数:28  
标签:剩余 frac 二次 pmod int 简记 模板 equiv

\(x^2\equiv n\pmod p\),其中 \(p\) 是奇素数

当 \(n=0\) 时有 \(x=0\),以下规定 \(n\not=0\)。


假设 \(n\) 是二次剩余且有多个不同解,其中两个解分别是 \(x_0,x_1\in [1,p)\)。

有 \({x_0}^2\equiv {x_1}^2\equiv n\pmod p\)。

移项,平方差公式得 \((x_0+x_1)(x_0-x_1)\equiv 0\pmod p\)。

由于 \(x_0\not =x_1\),所以 \((x_0+x_1)\equiv 0\pmod p\)。即 \(x_0,x_1\) 在模 \(p\) 意义下互为相反数。

所以每一对相反数对应着一个二次剩余,每一个二次剩余也只有可能对应着一对相反数。

所以在 \([1,p)\) 当中二次剩余与非二次剩余的个数都为 \(\frac{p-1}{2}\)。


根据费马小定理 \(x^{p-1}\equiv 1\pmod p\)。

若 \(n\) 是二次剩余则 \(n^{\frac{p-1}{2}}\equiv x^{p-1}\equiv 1\pmod p\)。

同时根据 \(n^{p-1}\equiv 1\pmod p\),得 \(n^{\frac{p-1}{2}}\equiv \pm 1\pmod p\)。

所以 \(n\) 是非二次剩余则 \(n^{\frac{p-1}{2}}\equiv -1\pmod p\)。

根据这个可以判断 \(n\) 是否为二次剩余。


解方程的时候,先随便找到一个 \(a\in[1,p)\) 使 \(a^2-n\) 是非二次剩余。

由于二次剩余与非二次剩余数量相同,所以随机找期望两次就能找到。

然后定义 \(i^2\equiv a^2-n\),这里 \(i\) 类比复数的概念。

根据二项式定理展开 \((a+i)^p\),由于 \(p\) 是质数,所以 \((a+i)^p\equiv a^p+i^p\)。

由定义有 \(i^p\equiv i(i^2)^{\frac{p-1}{2}}\equiv i(a^2-n)^{\frac{p-1}{2}}\equiv -i\)。

所以 \((a+i)^{p+1}\equiv (a-i)(a+i)\equiv a^2-(a^2-n)\equiv n\)。

所以 \((a+i)^{\frac{p+1}{2}}\) 就是解之一,另一个是其相反数。


#include<stdio.h>
#include<iostream>
#include<algorithm>
#define int long long
using namespace std;
int T,n,p,a,mul,ans;
struct node
{
    int r,i;
    inline node operator *(node &o)
    {return {(r*o.r+mul*i%p*o.i)%p,(r*o.i+i*o.r)%p};}
};
inline int ksm(node a,int b)
{
    node ans={1,0};
    while(b)
    {
        if(b&1) ans=ans*a;
        a=a*a,b>>=1;
    }
    return ans.r;
}
inline bool Check(int x){return ksm({x,0},(p-1)/2)==1;}
signed main()
{
#ifdef ONLINE_JUDGE
    cin.tie(0),cout.tie(0);
    ios::sync_with_stdio(0);
#endif
    cin>>T;
    while(T--)
    {
        cin>>n>>p;mul=0;
        if(!n){cout<<"0\n";continue;}
        if(!Check(n)){cout<<"Hola!\n";continue;}
        a=rand()%p;while(!a||Check((a*a-n+p)%p)) a=rand()%p;
        mul=(a*a-n+p)%p;ans=ksm({a,1},(p+1)/2);
        ans=min(ans,p-ans);cout<<ans<<' '<<p-ans<<'\n';
    }
    return 0;
}

标签:剩余,frac,二次,pmod,int,简记,模板,equiv
From: https://www.cnblogs.com/int-R/p/17970047/ercishengyu

相关文章

  • C++ STL标准模板库
    目录简介容器(Containers)迭代器(Iterators)算法(Algorithms)函数对象(FunctionObjects)适配器(Adaptors)分配器(Allocators)std::min_element()简介C++中的STL(标准模板库)可以分为六个部分,分别是容器(Containers)、迭代器(Iterators)、算法(Algorithms)、函数对象(FunctionObjects)、适配器(Adapto......
  • C语言爬虫程序编写的爬取APP通用模板
    互联网的飞快发展,尤其是手机终端业务的发展,让越来越多的事情都能通过手机来完成,电脑大部分的功能也都能通过手机实现,今天我就用C语言写一个手机APP类爬虫教程,方便后期拓展APP爬虫业务。而且这个模板是通用的适合各种APP爬虫,下面跟着我看下具体的代码吧。下面就是我给大家提供一个基......
  • 模板
    周日有模拟赛所以复习若干板子树状数组inlineintlowbit(intx){returnx&-x;}//lowbitinlineintask(intx){intans=0;while(x){ans+=t[x];x-=lowbit(x);}returnans;}//单点查询inlinevoidchange(intx,intv)......
  • 17类模板
    类模板类成为类名和类型参数的组合无论是一般类还是模板类,只有调用到的成员函数,才会出现在符号表上。#pragmaonce#include<iostream>#include<cstring>usingnamespacestd;template<typenameT>classSeqStack{//模板名称+类型参数列表=类名称private: T*......
  • Abp vnext FreeSql 生成模板,并提供下载模板接口
    DtoDto设置参考[ExcelImporter(IsLabelingError=true)]publicclassMyDto{ [ImporterHeader(Name="序号")] [ExporterHeader(DisplayName="序号")] publicintId{get;set;}}Controller生成模板[HttpGet("GenerateTemplate")]//[Wr......
  • 仿sina个人轻微博html静态网页模板
    一款最新的仿sina个人微博html静态网页模板(轻博客/轻微博/贴吧主页、qq社交空间主题),模板清新简洁、新颖,包含关注、粉丝、人气、个人资料、文章、视频等。比较适合类似爱装扮空间的女生,二次元动漫、插画绘画等内容的个人轻社交博客的模板主题。 模板主题特色:1......
  • 算法模板 v1.2.1.20240116
    算法模板v1.1.1.20240115:之前的历史版本已经不可寻,创建了第一份算法模板。v1.2.1.20240116:删除“编译”-“手动开栈”与“编译”-“手动开O优化”;将“编译”-“CF模板”中的第20行代码cin>>T;注释;删除“读写”及其目录下的内容;删除“图论”-“欧拉图”-“混合图”;删除“图论”-......
  • 16理解函数模板
    理解函数模板模板的意义:对函数类型可以做修改函数模板:boolcompare(Ta,Tb)模板实例化:定义一个模板参数类型,进行一次函数的实例化模板函数:一个函数模板的实例化就是一个模板函数模板类型参数:T模板非类型参数:模板的实参推演:根据实参反推模板参数类型模板的特例化:为函数......
  • 算法模板 v1.1.1
    算法模板编译CF模板#include<bits/stdc++.h>usingnamespacestd;/*====================*/#defineendl"\n"/*====================*/typedeflonglonglnt;/*====================*/voidSolve(void){}/*====================*/intmain(){#ifn......
  • thymeleaf—02—模板
    一、th:fragment模板片段我们可以使用模板,定义一些会经常复用的代码,使用th:fragment定义然后使用th:insert引入这个模板内容,或者使用th:replace进行内容替换;还有一个th:include标签也是引入模板内容,但是这个不推荐了; 除了增加模板,还可以使用th:remove进行模板的删除操作; ......