Pollard Rho 因式分解算法

转载自:https://www.cnblogs.com/dalt/p/8437119.html

Pollard Rho因子分解算法

    <div class="postBody">
        <div id="cnblogs_post_body" class="blogpost-body"><p>  有一类问题,要求我们将一个正整数x,分解为两个非平凡因子(平凡因子为1与x)的乘积x=ab。</p>

  显然我们需要先检测x是否为素数(如果是素数将无解),可以使用Miller-Rabin算法来进行测试。

  Pollard Rho是一个非常玄学的方式,用于在O(n^1/4)的期望时间复杂度内计算合数n的某个非平凡因子。事实上算法导论给出的是O(√p),p是n的某个最小因子,满足p与n/p互质。但是这些都是期望,未必符合实际。但事实上Pollard Rho算法在实际环境中运行的相当不错。

  Pollard Rho利用伪随机数生成公式来提供待测因子,其公式为xi=xi-1^2+c(mod n),其中c是开始时确认的随机常数。我们只要给出x1,利用这个公式可以生成一系列数值。由于每个数完全依赖于前一个数,因此数值的分布中必定含环,我们设t为环的路口,u为环的周长,那么有xt+i=xt+u+i。而整个数值分布就像一个ρ符号,因此该算法的后缀用Rho来表示。我们将该公式得出的序列视作随机序列。

  生日悖论中指出一个√d个学生的班级中,期望至少有一对人在同一天生日,其中d是一年中的日期,即365。同样一个√d个人的班级中,至少有一对人在同一天生日的概率大于50%。我们将n视作一年中的天数,而1~n-1中的每个值都对应一年中的日期,将x1,x2,…视作学生,那么序列中期望有两个有两个人相同,只需要序列的长度达到√n即可。因此我们可以认为ρ符号的尾部与环的周长的期望均为√n。

  假设n=ab,其中a与b均不是n的平凡因子,我们假设a<=b,可知a<=√n。我们记yi=xi(mod a)。可知:

yi=xi(mod&#xA0;a)=(xi&#x2212;12+c)(mod&#xA0;n)(mod&#xA0;a)=(xi&#x2212;12+c)(mod&#xA0;a)” role=”presentation”>yi=xi(mod a)=(x2i1+c)(mod n)(mod a)=(x2i1+c)(mod a)yi=xi(mod a)=(xi−12+c)(mod n)(mod a)=(xi−12+c)(mod a)

  我们依据a为模数建立了新的一个ρ型轨迹,且a的ρ型轨迹的环必然仅出现n的ρ型轨迹的环上的数值(模a的结果)。由同样的分析可得a的ρ型轨迹的环的尾部和环的长度的期望均为n^(1/4)。对于a的ρ型轨迹的环上的任意一点k,假设其对应的是两个不同的值xi与xj,即xi<>xj(mod n)但xi=xj(mod a)。此时可以知(xi-xj)=rp(mod n),而gcd(xi-xj, n)的结果必然是n的一个非平凡因子(且能被a整除)。我们可以利用一个特定的变量p先后在迭代到x1,x2,x4,x8,…时记录这些值,之后每次都校验gcd(xi-p, n)是否既非1又非n,如果满足则找到n的非平凡因子,否则继续迭代。之前说过a的ρ型轨迹的环的尾部和环的长度的期望均为n^(1/4),因此当我们p记录xh时,其中xh落在a的ρ型轨迹的环上且h大于等于环的周长时,此时我们会沿着a的ρ型轨迹的环进行周而复始的循环迭代,最终在修改p之前xi回到了xh的位置,此时借助gcd(xi-p, n)我们就找到了一个n的非平凡因子。h的期望应该为O(n^(1/4)),因此时间复杂度的期望应该为O(n^(1/4))。

  下面给出代码:

复制代码
pollard_rho(x)
    c = random()
    xi = random()
    i = 1
    h = 1
    xh = xi
    while(true)
        xi = xi * xi + c
        f = gcd(x, abs(xi - xh))
        if(f != 1 && f != n)
            return f
        i = i + 1
        if( i == h * 2)
            h = i
            xh = xi
复制代码

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
智慧校园整体解决方案是响应国家教育信息化政策,结合教育改革和技术创新的产物。该方案以物联网、大数据、人工智能和移动互联技术为基础,旨在打造一个安全、高效、互动且环保的教育环境。方案强调从数字化校园向智慧校园的转变,通过自动数据采集、智能分析和按需服务,实现校园业务的智能化管理。 方案的总体设计原则包括应用至上、分层设计和互联互通,确保系统能够满足不同用户角色的需求,并实现数据和资源的整合与共享。框架设计涵盖了校园安全、管理、教学、环境等多个方面,构建了一个全面的校园应用生态系统。这包括智慧安全系统、校园身份识别、智能排课及选课系统、智慧学习系统、精品录播教室方案等,以支持个性化学习和教学评估。 建设内容突出了智慧安全和智慧管理的重要性。智慧安全管理通过分布式录播系统和紧急预案一键启动功能,增强校园安全预警和事件响应能力。智慧管理系统则利用物联网技术,实现人员和设备的智能管理,提高校园运营效率。 智慧教学部分,方案提供了智慧学习系统和精品录播教室方案,支持专业级学习硬件和智能化网络管理,促进个性化学习和教学资源的高效利用。同时,教学质量评估中心和资源应用平台的建设,旨在提升教学评估的科学性和教育资源的共享性。 智慧环境建设则侧重于基于物联网的设备管理,通过智慧教室管理系统实现教室环境的智能控制和能效管理,打造绿色、节能的校园环境。电子班牌和校园信息发布系统的建设,将作为智慧校园的核心和入口,提供教务、一卡通、图书馆等系统的集成信息。 总体而言,智慧校园整体解决方案通过集成先进技术,不仅提升了校园的信息化水平,而且优化了教学和管理流程,为学生、教师和家长提供了更加便捷、个性化的教育体验。
好的,以下是使用 Python 语言实现 Pollard Rho 算法进行因式分解的代码: ```python import random def gcd(a, b): while b != 0: a, b = b, a % b return a def pollard_rho(n): x = random.randint(1, n-1) y = x c = random.randint(1, n-1) d = 1 while d == 1: x = (x ** 2 + c) % n y = (y ** 2 + c) % n y = (y ** 2 + c) % n d = gcd(abs(x - y), n) if d == n: return pollard_rho(n) return d def factorize(n): factors = [] while n > 1: factor = pollard_rho(n) factors.append(factor) n //= factor return factors n = 1234567890 factors = factorize(n) print(factors) ``` 在这个代码中,我们使用了 Pollard Rho 算法进行因式分解。首先,我们定义了一个辗转相除法的函数 gcd(a, b),用于求两个数的最大公约数。然后,我们定义了一个 pollard_rho(n) 函数,该函数接受一个正整数 n 作为参数,并返回 n 的一个因子。该函数通过随机选择 x 和 c,然后使用 f(x) = x^2 + c 的迭代公式来产生一个序列 x_0, x_1, x_2, ...,并使用 Floyd 算法来寻找序列中的循环节,最后找到两个序列中的相同元素并计算它们的差的绝对值和 n 的最大公约数,如果这个最大公约数不是 1 或 n,则表示我们已经找到了 n 的一个因子。如果这个最大公约数是 1 或 n,则需要重新选取 x 和 c,进行迭代。最后,我们定义了一个 factorize(n) 函数,该函数接受一个正整数 n 作为参数,并返回 n 的所有因子,该函数通过重复调用 pollard_rho(n) 函数来实现。最后,我们测试了这个函数,并输出了 n 的所有因子。 希望这个代码对你有所帮助!
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值