拉斯维加斯算法对n进行因子分解&&n取值范围2 <= N < 2^54

0048算法笔记——【随机化算法】拉斯维加斯随机化算法求解整数因子分解中的因子分割问题 问题描述      设n>1是一个整数。关于整数n的因子分解问题是找出n的如下形式的唯一分解式:。其中,p1如果n是一个合数,则n必有一个非平凡因子x,1给定一个合数n,求n的一个非平凡因子的问题称为整数n的因子分割问题。     求解思路      整数因子分解最直观的方法当数“试除法”,数论中的Mertens定理告诉我们76%的奇数都有小于100的素因子,因此对于大多数整数,“试除法”已 阅读详情
代码:
#include <cstdio>
#include <cstdlib>
#include <ctime>
#include <cstring>
#include <iostream>
#include<algorithm>
const int S=20;
using namespace std;
typedef long long LL;
#define maxn 10000

LL factor[maxn];
int tot;

LL muti_mod(LL a,LL b,LL c){    //返回(a*b) mod c,a,b,c<2^63
    a%=c;
    b%=c;
    LL ret=0;
    while (b){
        if (b&1){
            ret+=a;
            if (ret>=c) ret-=c;
        }
        a<<=1;
        if (a>=c) a-=c;
        b>>=1;
    }
    return ret;
}

LL pow_mod(LL x,LL n,LL mod){  //返回x^n mod c ,非递归版
    if (n==1) return x%mod;
    int bit[64],k=0;
    while (n){
        bit[k++]=n&1;
        n>>=1;
    }
    LL ret=1;
    for (k=k-1;k>=0;k--){
        ret=muti_mod(ret,ret,mod);
        if (bit[k]==1) ret=muti_mod(ret,x,mod);
    }
    return ret;
}

bool check(LL a,LL n,LL x,LL t){   //以a为基,n-1=x*2^t,检验n是不是合数
    LL ret=pow_mod(a,x,n),last=ret;
    for (int i=1;i<=t;i++){
        ret=muti_mod(ret,ret,n);
        if (ret==1 && last!=1 && last!=n-1) return 1;
        last=ret;
    }
    if (ret!=1) return 1;
    return 0;
}

bool Miller_Rabin(LL n){
    LL x=n-1,t=0;
    while ((x&1)==0) x>>=1,t++;
    bool flag=1;
    if (t>=1 && (x&1)==1){
        for (int k=0;k<S;k++){
            LL a=rand()%(n-1)+1;
            if (check(a,n,x,t)) {flag=1;break;}
            flag=0;
        }
    }
    if (!flag || n==2) return 0;
    return 1;
}

LL gcd(LL a,LL b){
    if (a==0) return 1;
    if (a<0) return gcd(-a,b);
    while (b){
        LL t=a%b; a=b; b=t;
    }
    return a;
}

LL Pollard_rho(LL x,LL c){
    LL i=1,x0=rand()%x,y=x0,k=2;
    while (1){
        i++;
        x0=(muti_mod(x0,x0,x)+c)%x;
        LL d=gcd(y-x0,x);
        if (d!=1 && d!=x){
            return d;
        }
        if (y==x0) return x;
        if (i==k){
            y=x0;
            k+=k;
        }
    }
}

void findfac(LL n){           //递归进行质因数分解N
    if (!Miller_Rabin(n)){
        factor[tot++] = n;
        return;
    }
    LL p=n;
    while (p>=n) p=Pollard_rho(p,rand() % (n-1) +1);
    findfac(p);
    findfac(n/p);
}

int main(){
    srand(time(NULL));
    int t;
    scanf("%d",&t);
    while (t--){
        LL n;
        scanf("%lld",&n);
        if (!Miller_Rabin(n))
        {
            //printf("Prime\n");
            cout<<n<<endl;
        }
        else{
            tot = 0;
            findfac(n);
            sort(factor,factor+tot);
            for (int i = 0; i < tot; i++) printf("%lld ",factor[i]);
             printf("\n");
        }
    }return 0;
}

法二:

#include <cstdio>
#include <cstdlib>
#include <ctime>
#include <cstring>
#include <iostream>
#include<algorithm>
const int S=20;
using namespace std;
typedef long long LL;
#define maxn 10000

LL factor[maxn];
int tot;

LL muti_mod(LL a,LL b,LL c){    //返回(a*b) mod c,a,b,c<2^63
    a%=c;
    b%=c;
    LL ret=0;
    while (b){
        if (b&1){
            ret+=a;
            if (ret>=c) ret-=c;
        }
        a<<=1;
        if (a>=c) a-=c;
        b>>=1;
    }return ret;
}

LL pow_mod(LL x,LL n,LL mod){  //返回x^n mod c
    LL ret=1;
    while(n)
    {
        if(n&1) ret=muti_mod(ret,x,mod);
        x=muti_mod(x,x,mod);
        n=n>>1;
    }return ret;
}

bool check(LL a,LL n,LL x,LL t){   //以a为基,n-1=x*2^t,检验n是不是合数
    LL ret=pow_mod(a,x,n),last=ret;
    for (int i=1;i<=t;i++){
        ret=muti_mod(ret,ret,n);
        if (ret==1 && last!=1 && last!=n-1) return 1;//n是合数
        last=ret;
    }
    if (ret!=1) return 1;
    return 0;
}

bool Miller_Rabin(LL n){
    LL x=n-1,t=0;
    while ((x&1)==0) x>>=1,t++;
    bool flag=0;//flag是0表示合数,1表示素数
    if (t>=1 && (x&1)==1){//当n为偶数时,它一定不是素数(2除外)
        for (int k=0;k<S;k++){
            LL a=rand()%(n-2)+1;
            if (check(a,n,x,t)) {flag=0;break;}
            flag=1;
        }
    }
    if (flag || n==2) return 1;
    return 0;
}

LL gcd(LL a,LL b){
    if (a==0) return 1;
    if (a<0) return gcd(-a,b);
    while (b){
        LL t=a%b; a=b; b=t;
    }
    return a;
}

LL Pollard_rho(LL x,LL c){
    LL i=1,x0=rand()%x,y=x0,k=2;
    while (1){
        i++;
        x0=(muti_mod(x0,x0,x)+c)%x;
        LL d=gcd(y-x0,x);
        if (d!=1 && d!=x){
            return d;
        }
        if (y==x0) return x;
        if (i==k){
            y=x0;
            k+=k;
        }
    }
}

void findfac(LL n){           //递归进行质因数分解N
    if (Miller_Rabin(n)){
        factor[tot++] = n;
        return;
    }
    LL p=n;
    while (p>=n) p=Pollard_rho(p,rand() % (n-1) +1);
    findfac(p);
    findfac(n/p);
}

int main(){
    srand(time(NULL));
    int t;
    scanf("%d",&t);
    while (t--){
        LL n;
        scanf("%lld",&n);
        if (Miller_Rabin(n))
        {
            //printf("Prime\n");
            cout<<n<<endl;
        }
        else{
            tot = 0;
            findfac(n);
            sort(factor,factor+tot);
            for (int i = 0; i < tot; i++) printf("%lld ",factor[i]);
             printf("\n");
        }
    }return 0;
}


随机化算法(2)拉斯维加斯算法和蒙特卡罗算法 实验要求 1、根据实验内容构思设计算法; 2、对所设计的算法采用大O符号进行时间复杂性分析; 3、上机实现算法; 4、实验报告内容应包括问题描述、问题分析、算法设计、算法实现、运行结果及算法复杂度分析等内容。 实验内容 1、使用拉斯维加斯( Las Vegas )算法求解1000-9999之间的任意随机整数n的因子划分问题,对于不同的测试用例给出具体的执行时间。 #include <cstdio> #include <cstdlib> #include <c 阅读详情

相关推荐

(算法设计与分析)第七章随机化算法概述

随机化算法:随机化算法把“对于所有合理的输入都必须给出正确的输出”这一求解问题的条件放宽,将随机性选择注入到算法中,在算法执行某些步骤时,可以随机地选择下一步该如何进行,同时允许结果是近似解或以较小概率出现错误,并以此为代价,获得算法运行时间的大幅度减少。随机化算法执行中注入的随机性依赖于随机数发生器所产生的随机数拉斯维加斯算法:舍伍德型算法的优点是,其计算时间复杂性对所有实例而言相对均匀,但与其相应的确定性算法相比,其平均时间复杂性没有改进。拉斯维加斯算法则不然,它能显著地改进算法的有效性。

快乐江湖的博客 1167

拉斯维加斯算法

拉斯维加斯算法 通俗理解: 假如有一把锁,给我100把钥匙,只有1把是对的。于是我每次随机拿1把钥匙去试,打不开就再换1把。我试的次数越多,打开(最优解)的机会就越大,但在打开之前,那些错的钥匙都是没有用的。这个试钥匙的算法,就是拉斯维加斯算法. 拉斯维加斯算法就是每次采样尽量找最好的,但不保证能找到, 采样越多,越有机会找到最优解 蒙特卡洛和拉斯维加斯 这两类随机算法之间的选择,往往受到问...

weixin_44737877的博客 4835

30、公钥密码学中的代数与数论计算

本文深入探讨了公钥密码学中的核心代数与数论计算方法,涵盖有限域上特定阶元素的构造、多项式因式分解的三阶段算法(SFF、DDF、EDF)以及椭圆曲线上点的表示与运算。文章详细解析了相关算法原理与流程,并结合练习题强化理解,重点突出其在密码系统中的应用价值,如高效实现密钥运算和保障安全性。内容为理解和设计现代公钥密码体制提供了坚实的理论与实践基础。

xgboost6farmer的博客 59

蒙特卡罗算法 与 拉斯维加斯算法

蒙特卡罗算法并不是一种算法的名称,而是对一类随机算法的特性的概括。媒体说“蒙特卡罗算法打败武宫正树”,这个说法就好比说“我被一只脊椎动物咬了”,是比较火星的。实际上是ZEN的算法具有蒙特卡罗特性,或者说它的算法属于一种蒙特卡罗算法。 那么“蒙特卡罗”是一种什么特性呢?我们知道,既然是随机算法,在采样不全时,通常不能保证找到最优解,只能说是尽量找。那么根据怎么个“尽量”法儿,我们我们把随机算法

wudisunyanzi的专栏 8445

【信息科学与工程学】【数据科学】数据科学领域 第六篇 算法设计 01

算法设计

weixin_49199313的博客 1501

14、非确定性多项式时间与密码学中的复杂度问题

本文深入探讨了计算机科学与密码学中的复杂度问题,重点分析了非确定性多项式时间(NP)相关概念,包括NP问题、NP完全问题的定义与特性,以及非多项式时间复杂度的界定和实际影响。文章以SQUARE-FREENESS问题和SATISFIABILITY问题为例,阐述了NP问题的验证机制和计算困难性,并讨论了复杂度在密码系统安全性、算法设计及未来研究方向中的应用与挑战。

nut55的博客 82

三种“随机”算法介绍

三种“随机”算法介绍 本文主要介绍蒙特卡洛(Monte Carlo)算法、拉斯维加斯(Las Vegas)算法和舍伍德(Sherwood)算法。 蒙特卡洛算法与拉斯维加斯算法 蒙特卡罗算法并不是一种算法的名称,而是是一类随机方法的统称。这类方法的特点是,可以在随机采样上计算得到近似结果,随着采样的增多,得到的结果是正确结果的概率逐渐加大,但在(放弃随机采样,而采用类似全采样这样的确定性方法)获得真正的结果之前,无法知道目前得到的结果是不是真正的结果。 从特性特性来说,我们知道,既然是随机算法,在采样不全时,

Xixoqw的博客 4918

软件设计师(八)算法设计与分析

算法设计和分析

qq_38618691的博客 1596

7-4拉斯维加斯算法

拉斯维加斯

我走的每一步都算数 418

进阶数据结构——链式前向星

链式前向星是一种进阶的数据结构,主要用于图的存储。我希望大家先看这个视频(蓝色字体点进去) 不然你很难理解的。在图论中,图的存储方式主要有邻接矩阵和邻接表两种。邻接矩阵虽然建图简单方便,但占内存较大,节点数量稍微大点的题目就难以使用(适合稠密图);而邻接表虽然节省空间,但其指针形式难写易错,且vector形式的读取速度较慢,易导致大数据下的超时(TLE)。针对上述问题,链式前向星作为一种折中的方式应运而生。链式前向星本质上是一种静态链表,它将数据以链表形式连接在一起。

ycs66的博客 2138

数字IC后端实现 | Innovus各个阶段常用命令汇总

数字IC后端设计实现之Innovus常用命令汇总

weixin_37584728的博客 7323

[XJTUSE 算法设计与分析] 第七章 随机化算法

第七章 随机化算法

weixin_47692652的博客 3108

#1机器学习(西瓜书)自学记录

《机器学习 》 Datawhale 组队学习, 吃瓜自学笔记。

qq_74168740的博客 1149

南开大学软件学院2021年秋季学期研究生算法课程(复习)非确定算法:随机与近似

非确定算法:随机与近似 确定性算法Deterministic algorithms 对于给定的输入,算法的输出和运行时间不变 非确定性算法Non-deterministic algorithms 对于给定的输入,算法的输出或运行时间是不确定的 启发式算法Heuristic algorithms 利用输入数据的特征和信息对问题进行求解 尽全力逼近最优解,但是无法得知和最优解的差距 近似算法Approximation algorithms 对问题给出一个近似最优解(数据无关) 可以

Ritannn的博客 1056

伺服电机开发实战指南

伺服电机作为工业自动化的核心部件,正经历前所未有的技术革新。本文从基础原理出发,详细介绍了伺服电机的分类、工作原理和特性,分析了伺服电机系统组成与核心部件,探讨了企业级开发技术,包括控制算法、通信协议和故障诊断等高级功能,并提供了实战案例分析,从行业应用到具体开发步骤,展示了伺服电机的工程实现。通过深入理解伺服电机的原理、掌握开发技术、学习应用案例,可以实现伺服系统的高性能开发与应用。

全栈 1681

基于YOLOv8的应急通道占用监测系统设计与实现

通过详细的数据集选择、模型训练、代码实现等内容,本博客为您提供完整的系统搭建过程,帮助您构建高效的监测系统。然而,在一些建筑物和公共场所中,应急通道经常被不当占用,导致紧急情况下无法及时使用,严重影响人员的疏散效率。YOLOv8是YOLO系列中的最新版本,它通过引入深度学习的优化和改进,在保证检测速度的同时,显著提升了检测精度。同时,随着深度学习技术的不断发展,检测精度与速度的提升将使得该系统在更广泛的场景中应用。:如果已有监控设备,可以采集应急通道的实时视频,并进行标注,生成占用监测数据集。

YOLO 797

算法分析与设计复习笔记

算法分析与设计复习笔记第一章 算法概述第二章 递归与分治策略第三章 动态规划第四章 贪心算法第五章 回溯法第六章 分支限界法第七章 随机化算法 第一章 算法概述 算法的性质:输入、输出、确定性、有限性 算法的复杂性分析: 算法的渐进复杂性: T(N) - T’(N) / T(N) -> 0,就说T’(N)是T(N)当N->无穷的渐进性态。 f(N) = O(g(N)) : 当N >= N0时有f(N) <= Cg(N), 称函数f(N)当N充分大时有上界,g(N)是它的一个上界。

Maxi_0902的博客 456

【CAN总线测试】——通讯相关诊断测试

本章主要介绍通讯相关诊断测试用例设计

LOVE135149的博客 1815

常见算法思想

#算法 常用算法思想 ###穷举算法思想(Exhaustive Attack method) 穷举算法是最简单的一种算法,其依赖于计算机的强大计算能力来穷尽每一种可能的情况,从而达到求解问题的目的。穷举算法效率并不高,但是适应于一些没有明显规律可循的场合 穷举算法的基本思想就是从所有可能的情况中搜索正确的答案,其执行步骤如下: 对于一种可能的情况,计算其结果。 判断结果是否满足要求,如果不满足则执行第(1 ) 步来搜索下一个可能的情况;如果满足要求,则表示寻找到一个正确的答案 ###递推算法思想 递推算

a4208xiaojin的博客 303

【嵌入式硬件】DRV8874电机驱动

1)N沟道H桥电机驱动;2)驱动1个双向有刷直流电机;3)2个单向有刷直流电机;4)4.5V-37V工作电压范围;5)集成电流感测和调节;6)成比例电流输出(IPROPI);7)可选电流调节(IMODE):逐周期或固定关断时间;8)支持1.8、3V、5V逻辑输入;9)集成保护:欠压、电荷泵欠压、过流保护、输出关闭、热关断、自动故障恢复。

qq_39200110的博客 4424

SAP-MM-供应商对账平台(功能集合)

(1)集成OA审批,线上核销,结果写入SAP; (2)集成SRM,线上与供应商对账确认,写入SAP; (3)集成财务付款结果确认写入,OA回传结果,定时同步SRM供应商平台。 欢迎留言交流,功能完善,如需要页面设计,请订阅专栏

qq_32198063的博客 748

NTU课程笔记 MAS714(8) 分治与排序

1 分治主要思想 将问题分割成多个子问题(divide ) 递归地解决问题 把子问题的结果合并成总问题的结果(conquer) 2 排序 2.1 插入排序 假设输入是A[1...n] 2.1.1 时间复杂度 令T(n)表示排序n个元素的时间复杂度 于是我们有 2.2 合并排序 在第三步合并的时候,我们需要创建大小为n的数组C,从左向右扫描A和B,将小的元素放入C中,然后将相应的指针向后移动 2.2.1 时间复杂度 那么,如何计算这个呢?我们使用递...

qq_40206371的博客 287

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

切回 App 自动刷新列表怎么做?V2exOS 的 scenePhase 自动刷新机制深度解析

V2exOS 是一个用 SwiftUI 编写的 V2ex macOS/iOS/tvOS 客户端。它内置了一个很贴心的细节:切回 App 时列表会自动刷新。这篇文章带你深度拆解 V2exOS 的 scenePhase 自动刷新机制——从 SwiftUI 场景生命周期监听,到 10 分钟间隔防抖判断,再到用户可关闭的开关设置,整条链路只有几十行代码,但麻雀虽小五脏俱全。 [![V2exOS macO

gitblog_00632的博客 370

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

LeetCode-Go 的 README 自动生成机制:template.markdown 模板与 Go 渲染链路深度解析

> 本文以 [ctl/template/template.markdown](https://link.gitcode.com/i/bf7b70c6b3481dc3c2a6fad4887f1866) 为绝对主线,解析 LeetCode-Go 仓库如何用一份带 Go 模板占位符的 Markdown 文件,配合 `ctl` 命令行工具自动生成包含 700+ 题解、19 大算法专题与内嵌算法模板库的主

gitblog_00325的博客 335
上一篇: 舍伍德算法改进快速排序
下一篇: 数独游戏
smallacmer
博客等级 码龄15年 112粉丝 425原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值