首页 > 其他分享 >大数因数分解Pollard_rho

大数因数分解Pollard_rho

时间:2024-01-20 16:36:45浏览次数:38  
标签:return 因数分解 tar long Pollard rho ans include mod

大数因数分解Pollard_rho

#include <iostream>

#include <cstdio>

#include <algorithm> 

#include <cmath> 

#include <cstring> 

#include <map> 

using namespace std;

 

const int times = 50;

int number = 0;

 

map<long long, int>m;

long long Random( long long n )

{

  return ((double)rand( ) / RAND_MAX*n + 0.5);

}

 

long long q_mul( long long a, long long b, long long mod ) //快速乘法取模

{

long long ans = 0;

  while(b)

  {

    if(b & 1)

    {

      ans += a;

    }

    b /= 2;

    a = (a + a) % mod;

 

  }

  return ans;

}

 

long long q_pow( long long a, long long b, long long mod ) //快速乘法下的快速幂,叼

{

  long long ans = 1;

  while(b)

  {

    if(b & 1)

    {

      ans = q_mul( ans, a, mod );

    }

    b /= 2;

    a = q_mul( a, a, mod );

  }

  return ans;

}

 

bool witness( long long a, long long n )//miller_rabin算法的精华

{

  long long tem = n - 1;

  int j = 0;

  while(tem % 2 == 0)

  {

    tem /= 2;

    j++;

  }

 

  long long x = q_pow( a, tem, n ); //得到a^(n-1) mod n

  if(x == 1 || x == n - 1) return true;

  while(j--)

  {

    x = q_mul( x, x, n );

    if(x = n - 1) return true;

  }

  return false;

}

 

bool miller_rabin( long long n )  //检验n是否是素数

{

 

  if(n == 2)

    return true;

  if(n < 2 || n % 2 == 0)

    return false;

 

  for(int i = 1; i <= times; i++)  //做times次随机检验

  {

    long long a = Random( n - 2 ) + 1; //得到随机检验算子 a

    if(!witness( a, n ))  //用a检验n是否是素数

      return false;

  }

  return true;

}

 

long long gcd( long long a, long long b )

{

  if(b == 0)

    return a;

  return gcd( b, a%b );

}

 

long long pollard_rho( long long n, long long c )//找到n的一个因子

{

  long long x, y, d, i = 1, k = 2;

  x = Random( n - 1 ) + 1;

  y = x;

  while(1)

  {

    i++;

    x = (q_mul( x, x, n ) + c) % n;

    d = gcd( y - x, n );

    if(1<d&&d<n)

      return d;

    if(y == x)//找到循环,选取失败,重新来

      return n;

    if(i == k) //似乎是一个优化,但是不是很清楚

    {

      y = x;

      k <<= 1;

    }

  }

}

 

void find( long long n, long long c )

{

  if(n == 1)

    return;

  if(miller_rabin( n ))

  {

    m[n]++;

    number++;

    return;

  }

 

  long long p = n;

  while(p >= n)

    p = pollard_rho( p, c-- );

  find( p, c );

  find( n / p, c );

}

 

int main( )

{

  long long tar;

  while(cin >> tar)

  {

    number = 0;

    m.clear();

    find( tar, 2137342 );

    printf( "%lld = ", tar );

    if(m.empty())

    {

      printf( "%lld\n", tar );

    }

    for(map<long long, int>::iterator c = m.begin(); c != m.end();)

    {

      printf( "%lld^%d", c->first, c->second );

      if((++c) != m.end())

        printf( " * " );

    }

    printf( "\n" );

  }

  return 0;

}

 

标签:return,因数分解,tar,long,Pollard,rho,ans,include,mod
From: https://www.cnblogs.com/mingzhaomz/p/17976681

相关文章

  • 质数判断&质因数分解
    引入众所周知,素数的判断在longlong级别是不能\(O(\sqrt{n})\)硬上的。那怎么办呢??参考文献。ababab,先来最低效的。以下复杂度均考虑高精。1.试除法\(O(\sqrtn)\)枚举,\(n\le10^{14}\)。优化只枚举质数,无法优化预处理质数时间。2.Millar-Rabinlonglong:\(O(k\t......
  • 洛谷比赛【LGR-171-Div.3】深圳科创学院基础赛 #7 &「RHOI」Round 2 赛后总结
    洛谷比赛【LGR-171-Div.3】深圳科创学院基础赛#7&「RHOI」Round2赛后总结比赛链接:https://www.luogu.com.cn/contest/146495建议先看原题再看文章。A-Water(P10056)有\(n\)个杯子,每个杯子的容积是\(a\),且初始装有\(b\)体积水。你可以进行任意次操作,每次操作选择任......
  • High-Efficiency Lossy Image Coding Through Adaptive Neighborhood Information Agg
    目录简介创新点内容EntropyCodingUsingMultistageContextModel模型结构残差邻域注意力块ResidualNeighborhoodAttentionBlockRNAB激活函数高斯误差线性单元激活函数GELU并行解码简介创新点IntegratedConvolutionandSelf-Attention(ICSA)unit提出集成卷积和自......
  • Pollard-Rho 学习笔记
    前言其实很早就看到过了,下定决心去学的,居然是因为翻到之前口胡的题目,然后发现之前做法假了,继续尝试做的时候发现需要这个算法,于是,题目就绿->黑了。Step.1引入求一个数的所有因数,这个问题伴随了我们很久了,现在又要翻出来鞭尸。最开始的时候,我们使用的是最朴素的\(O(n)\)试除......
  • 【欧拉图】Euler Graph(Fluery算法,Hierholzer算法)
    还在持续更新ing前言此乃小Oler的一篇算法随笔,从今日后,还会进行详细的修订。注明:有参考自论文《欧拉图相关的生成与计数问题探究》简单介绍著名的哥尼斯堡七桥问题是18世纪著名的古典数学问题之一,该问题在相当长的时间里无人能解。欧拉经过研究,于1736年发表了论文《哥尼......
  • 质因数分解
    acwing的最基础模板https://www.acwing.com/blog/content/406/知乎大佬给的各种数据范围模板大全:https://zhuanlan.zhihu.com/p/591377294对于其中的一部分进行提炼形成自己的模板1.使用场景:假设有n个数需要分解,每个数最大可能是N,下面给出的这种代码的时间复杂度是\(O(nlogN)......
  • Pollard-Rho 算法
    Miller-Rabin素性检测部分内容摘自题解P4718/论Miller-Rabin算法的确定性化-It'sLUNATICtime!)根据费马小定理,若\(p\)为素数,那么对于\(1\leqa<p\),都有\(a^{p-1}\equiv1\pmodp\)。因此,若存在\(1\leqa<p\)使得\(a^{p-1}\not\equiv1\pmodp\),那么......
  • pollard-rho
    补写算法流程。生日悖论:值域为\(n\),时,期望随机\(O(\sqrt{n})\)(OI-wiki上给的是\(\sqrt{2n\ln2}\))个数有数字相同。(感觉有点奇怪,原表述是这么多次有数字相同的概率是\(\frac{1}{2}\)。)算法流程:尝试分解\(n\)的最小非平凡因子\(m\)设\(f(x)=x^2+c\),所有运算模......
  • P1075 [NOIP2012 普及组] 质因数分解
    因为n是两个质数的乘积,所以直接暴力枚举,只要能被整除,直接输出因为是要求大的那个,所以从小到大枚举,输出商即可点击查看代码#include<bits/stdc++.h>usingnamespacestd;#defineLLlonglongintmain(){ LLn; cin>>n; for(inti=2;1LL*i*i<=n;i++){ if......
  • P1075 [NOIP2012 普及组] 质因数分解
    算法一根据唯一分解定理,小于\(n\)的最大的能整除\(n\)的整数一定就是答案,可以暴力枚举。时间复杂度\(O(n)\),实际得分\(60\)。算法二发现算法一不能通过的原因是较大的那个质数可能的取值范围太大了。而较小的那个质数一定小于等于\(\sqrtn\),我们枚举它即可。时间复......