首页 > 其他分享 >大质数分解模板

大质数分解模板

时间:2024-08-08 21:17:58浏览次数:12  
标签:std lam return power 质数 i64 分解 mul 模板

jiangly的(偷一下

i64 mul(i64 a, i64 b, i64 m) {
    return static_cast<__int128>(a) * b % m;
}
i64 power(i64 a, i64 b, i64 m) {
    i64 res = 1 % m;
    for (; b; b >>= 1, a = mul(a, a, m))
        if (b & 1)
            res = mul(res, a, m);
    return res;
}
bool isprime(i64 n) {
    if (n < 2)
        return false;
    static constexpr int A[] = {2, 3, 5, 7, 11, 13, 17, 19, 23};
    int s = __builtin_ctzll(n - 1);
    i64 d = (n - 1) >> s;
    for (auto a : A) {
        if (a == n)
            return true;
        i64 x = power(a, d, n);
        if (x == 1 || x == n - 1)
            continue;
        bool ok = false;
        for (int i = 0; i < s - 1; ++i) {
            x = mul(x, x, n);
            if (x == n - 1) {
                ok = true;
                break;
            }
        }
        if (!ok)
            return false;
    }
    return true;
}
std::vector<i64> factorize(i64 n) {
    std::vector<i64> p;
    std::function<void(i64)> f = [&](i64 n) {
        if (n <= 10000) {
            for (int i = 2; i * i <= n; ++i)
                for (; n % i == 0; n /= i)
                    p.push_back(i);
            if (n > 1)
                p.push_back(n);
            return;
        }
        if (isprime(n)) {
            p.push_back(n);
            return;
        }
        auto g = [&](i64 x) {
            return (mul(x, x, n) + 1) % n;
        };
        i64 x0 = 2;
        while (true) {
            i64 x = x0;
            i64 y = x0;
            i64 d = 1;
            i64 power = 1, lam = 0;
            i64 v = 1;
            while (d == 1) {
                y = g(y);
                ++lam;
                v = mul(v, std::abs(x - y), n);
                if (lam % 127 == 0) {
                    d = std::gcd(v, n);
                    v = 1;
                }
                if (power == lam) {
                    x = y;
                    power *= 2;
                    lam = 0;
                    d = std::gcd(v, n);
                    v = 1;
                }
            }
            if (d != n) {
                f(d);
                f(n / d);
                return;
            }
            ++x0;
        }
    };
    f(n);
    std::sort(p.begin(), p.end());
    return p;
}

标签:std,lam,return,power,质数,i64,分解,mul,模板
From: https://www.cnblogs.com/Kescholar/p/18349759

相关文章

  • C# 设计模式之模板方法模式
    总目录前言在日常的工作中,有时候我们做PPT,做合同,做简历,如果我们自己从头去写这些文档,不免有些太过耗时耗力;大多时候都是去找相关的PPT模板,合同模板,简历模板,拿过来直接用。为什么可以使用模板,因此这些资料大部分的信息和信息框架都是一致的,我们只需要将自己差异化的内容填......
  • 黑神画Ⅱ--Unix 是下一代人工智能的模板吗?
    有一张图被用来描述GPT5比GPT4大多少,GPT3被描绘成一条大白鲨,GPT4被描绘成一条虎鲸,然后GPT5被描绘成一条座头鲸,这表明它们训练的数据量大幅增加。这是一个有趣的类比,因为它传达了规模的概念,但当你思考这些类比代表什么时,它就更加有趣了。GPT3是鱼类世界中的顶级捕食......
  • 创造智能对话:在LangChain中巧妙使用变量与模板
    创造智能对话:在LangChain中巧妙使用变量与模板在人工智能的世界里,对话管理是一项艺术,也是一项技术挑战。LangChain作为一个前沿的对话管理框架,提供了一套强大的工具,让开发者能够创建动态、个性化的对话体验。本文将深入探讨如何在LangChain中创建和管理变量,通过详细的步骤......
  • 网站源码医疗机构pbootcms模板网页设计主题
    医疗机构的网站设计分享我很高兴向大家介绍我刚刚制作的医疗机构的网站设计。友好的站点界面,是打动访客的第一步。医疗机构网站的主题网站设计需要充分考虑到医疗行业的特殊性和用户需求,以下是一个清晰的设计介绍:1.设计原则用户友好性:网站的设计和功能应便于用户理解和使......
  • P3834 【模板】可持久化线段树 2
    P3834【模板】可持久化线段树2-洛谷|计算机科学教育新生态(luogu.com.cn)#include<bits/stdc++.h>usingnamespacestd;usingi64=longlong;template<classNode>structPersidentSegmentTree{#definelc(u)tr[u].l#definerc(u)tr[u].r#definesum(u)t......
  • 主席树模板
    template<classNode>structPersidentSegmentTree{#definelc(u)tr[u].l#definerc(u)tr[u].r#definesum(u)tr[u].sconstintn;inttot=0;vector<Node>tr;vector<int>root;PersidentSegmentTree():n(0){}......
  • P10814 【模板】离线二维数点
    原题链接题解对于一段区间\([l,r]\)我们可以在\(r\)的位置查询一次,然后利用差分的思想跑到l-1再查一次虽然这样不行,但是可以先在\(l-1\)的位置查询一次,然后再在\(r\)的位置查询一次,然后顺序遍历,每次遍历就把对应位置上的数激活,可以用树状数组code#include<bits/stdc+......
  • 136程序——源程序-CPO-VMD【24年新算法】冠豪猪优化算法(CPO)优化VMD变分模态分解---
    ......
  • 模板
    [置顶]缺省源#include<bits/stdc++.h>#defineDebugputs("Oops!")//#defineintlonglongusingnamespacestd;constintN=1e5+5,M=5e5+5;inlineintread(){ intx=0,f=1;charc=getchar(); while(!isdigit(c)){if(c=='-......
  • kmp算法模板
    模板//pi代表前缀函数 //pi[i]:s[0~i]的最长匹配真前后缀长度 vecotr<int>pi(str.size()); //求前缀函数 for(inti=1;i<str.size();i++){ intlen=pi[i-1];//前一个值的pilen是我们想要找到的一个长度值 while(len!=0&&str[i]!=str[len]){//不匹配时,......