首页 > 其他分享 >二次剩余

二次剩余

时间:2023-02-11 16:25:34浏览次数:31  
标签:剩余 power 二次 int res cpx base mod

概念

\(\forall c \in N^+\),如果 \(\exists x^2 \equiv c \pmod p\),则称 \(c\) 是模 \(p\) 的二次剩余。

对于 \(p\) 是奇质数的情况,有简单的方法求出同余方程 \(x^2 \equiv c \pmod p\) 的解。

思路

结论:

  • 当且仅当 \(c^{\frac{p - 1}{2}} = 1\) 时 \(c\) 是模 \(p\) 的二次剩余。

  • 模 \(p\) 意义下的二次剩余有 \(\frac{p - 1}{2}\) 个。

证明可能是伪证,就不放了。

根据结论可以导出 Cipolla 算法。

首先需要找出一个同余系中的数 \(a\) 使得 \(a^2 - c\) 是非二次剩余。

对于同余方程 \(x^2 \equiv c \pmod p\),因为非二次剩余的数量在 \(\frac{p}{2}\) 左右,所以随机检验数的方式可以在期望 \(2\) 次的时间内找到一个 \(a\).

定义 \(i^2 \equiv a^2 - c \pmod p\),这里 \(i\) 不是同余系中的数,可以认为是虚数。

此时有结论:\((a + i)^{p + 1} \equiv c \pmod p\),并且 \((a + i)^{p + 1}\) 的虚部恰为 \(0\).

证明不太会,咕了。

直接写个复数类实现就行。

代码

#include <cstdio>
#include <ctime>
#include <cstdlib>
using namespace std;

#define swap(x, y) x ^= y ^= x ^= y

typedef long long ll;

int t, mod, c;
ll Ipw2;

struct cpx
{
    ll real, imag;

    cpx operator * (const cpx& rhs) const { return (cpx){(real * rhs.real + imag * rhs.imag % mod * Ipw2) % mod, (real * rhs.imag + imag * rhs.real) % mod}; }
} ;

int qpow(int base, int power)
{
    int res = 1;
    while (power)
    {
        if (power & 1) res = 1ll * res * base % mod;
        base = 1ll * base * base % mod, power >>= 1;
    }
    return res;
}

cpx qpow(cpx base, int power)
{
    cpx res = (cpx){1, 0};
    while (power)
    {
        if (power & 1) res = res * base;
        base = base * base, power >>= 1;
    }
    return res;
}

int main()
{
    srand(time(0));
    scanf("%d", &t);
    while (t--)
    {
        scanf("%d%d", &c, &mod);
        if (c == 0) { puts("0"); continue; }
        if (qpow(c, (mod - 1) / 2) == mod - 1) { puts("Hola!"); continue; }
        int a;
        while (true)
        {
            a = (rand() % (mod - 1) + mod) % (mod - 1) + 1;
            Ipw2 = (1ll * a * a - c + mod) % mod;
            if (qpow(Ipw2, (mod - 1) / 2) == mod - 1)
            {
                cpx w = (cpx){a, 1};
                w = qpow(w, (mod + 1) / 2);
                ll r1 = w.real, r2 = mod - w.real;
                if (r1 > r2) swap(r1, r2);
                printf("%lld %lld\n", r1, r2);
                break;
            }
        }
    }
    return 0;
}

标签:剩余,power,二次,int,res,cpx,base,mod
From: https://www.cnblogs.com/lingspace/p/er-ci-sheng-yu.html

相关文章

  • jmeter二次开发自定义函数助手
    需求:在工作中,需要使用唯一的字符串来作为订单ID,于是想到了UUID,要求uuid中不能有特殊字符包括横线,所以就有了重新写一个uuid进行使用;准备:idea依赖包:   注意事项:必......
  • 二次剩余
    二次剩余定义对于同余方程\(x^2\equivn\pmodp\)有解,则称\(n\)为二次剩余,否则\(n\)为非二次剩余,其中\(p\)为奇素数。欧拉准则用于判断一个数\(n\)是否为......
  • Revit二次开发之获取墙体立面轮廓 (未剪切、连接状态)
    大家都知道,我们从Element.Geometry中获取的都是被剪切、连接之后的几何实体了,那么,如果我们想获取墙体被其他柱、墙、楼板、门窗剪切、连接之前的几何轮廓呢?通过ExporterI......
  • 二次供水远程监测方案
    ​行业现状随着城镇化步伐的加快,用于城市二次供水的无负压供水设备正被居民楼、小区广泛使用。但由于居民楼与小区在各城市中广泛分布,因此,如何实时有效地监控及管理全城甚至......
  • DataX插件二次开发指南
    一、DataX为什么要使用插件机制?从设计之初,DataX就把异构数据源同步作为自身的使命,为了应对不同数据源的差异、同时提供一致的同步原语和扩展能力,DataX自然而然地采用了框......
  • 全流程搞清楚 Kubernetes API 的使用,可进行业务二次开发对接 k8s 调用,详细图文说明以
    全流程搞清楚KubernetesAPI的使用,可进行业务二次开发对接k8s调用,详细图文说明以及常见问题整理。使用CLI(如curl)或GUI(如postman)HTTP客户端调用KubernetesAPI有很多理由......
  • 中国剩余定理
    【模板】中国剩余定理(CRT)/曹冲养猪题目描述自从曹冲搞定了大象以后,曹操就开始捉摸让儿子干些事业,于是派他到中原养猪场养猪,可是曹冲满不高兴,于是在工作中马马虎虎,有一次......
  • 剩余系 与 完全剩余系 与 简化剩余系
    剩余系:由关于模m同余的数的集合,每一个集合叫做关于模mmm同余的剩余系比如模5剩余系:<Mod5=0><Mod_5=0><Mod5=0>:0,5,10,15…<Mod5=1><Mod_5=1><Mod5=1>:1,6,7,1......
  • SQL注入-二次注入
    SQL注入-二次注入-dnslog注入二次注入二次注入一般是用于白盒测试、黑盒测试就算是找到注入也没办法攻击。使用sqlilabs-less24-post登陆框&二次注入演示在原来数据库......
  • SQL注入-二次注入
    SQL注入-二次注入-dnslog注入二次注入二次注入一般是用于白盒测试、黑盒测试就算是找到注入也没办法攻击。使用sqlilabs-less24-post登陆框&二次注入演示在原来数据库......