• Jzoj4458 密钥破解——Pollard-rho


    此题非常新颖,有一个专门的算法,所以如果没有了解过,那么就只能写暴力卡了

    这道题后面的几步都很简单,一个扩展gcd求逆元,一个快速幂,所以关键就是求r,而这需要对N=pq进行分解

    本来这个问题在是一个NP问题,不存在多项式算法(这里的多项式指的是lgN形式的式子,因为N通常有10^100以上的级别)

    但是这里不需要写高精度所以N最大就是10^18

    介绍一下这个问题的专门算法Pollard-rho

    TMD劳资3k的博文被吞了我就直接发源文件截图好了



    最后一个std

    #include<stdio.h>
    #include<time.h>
    #include<stdlib.h>
    #define L long long
    #define SL __int128
    L e,c,d,N,p=1,r,q,a=2,b=2,A,y;
    L abs(L x){ return x>0?x:-x; }
    L f(L x){ return ((SL)x*x+A)%N; }
    L gcd(L a,L b){
    	for(L c;b;a=b,b=c) c=a%b;
    	return a;
    }
    L pow(SL x,L k,L M){
    	SL S=1;
    	for(;k;x=x*x%N,k>>=1)
    		if(k&1) S=S*x%M;
    	return S;
    }
    L extgcd(L a,L b,L& x,L& y){
    	if(b){
    		L r=extgcd(b,a%b,y,x);
    		y-=x*(a/b);
    		return r;
    	} else { x=1,y=0; return a; }
    }
    int main(){
    	srand(time(0));
    	scanf("%lld%lld%lld",&e,&N,&c); 
    	start:
    	A=rand(); a=2;b=2;
    	do{
    		a=f(a); b=f(f(b));
    		p=gcd(abs(b-a),N);
    		if(p>1) break;
    	} while(a!=b);
    	if(p==1) goto start;
    	q=N/p; if(p>q){p^=q;q^=p;p^=q;}
    	r=(p-1)*(q-1);
    	extgcd(e,r,d,y); d=(d+r)%r;
    	printf("%lld %lld
    ",d,pow(c,d,N));
    }

  • 相关阅读:
    python3线程介绍01(如何启动和调用线程)
    CentOS7 设置静态 ip
    png2ico
    Thunderbird 配置 QQ mail
    memcached 开机启动 (Ubuntu)
    CentOS7 docker 安装的 container-selinux 问题及解决
    YAML 的基本语法
    docker 的脚本化安装和使用
    解决Windows下 “setup.py build” 时出现错误 ” error: Unable to find vcvarsall.bat”
    Electric Fence
  • 原文地址:https://www.cnblogs.com/Extended-Ash/p/7774381.html
Copyright © 2020-2023  润新知