URAL 1141(扩展欧几里德+欧拉函数)

来源:互联网 发布:电脑免费剪辑软件 编辑:程序博客网 时间:2024/06/05 18:24

传送门

这就是传说中的RSA加密?!

题意:

给出正整数e,n,c。已知n=p*q,其中p,q为两个奇质数并且gcd(e,(p-1)*(q-1))=1。求出一个m使m^e=c(mod n)。

题解:


#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#include<cassert>using namespace std;typedef long long ll;int e,n,c;inline int phi(int n) {int ret=n,a=n;for (int i=2;i*i<=n;++i) {if (a%i==0) ret=ret/i*(i-1);while (a%i==0) a/=i;}if (a>1) ret=ret/a*(a-1);return ret;}int exgcd(int a,int b,int &x,int &y) {if (!b) {x=1,y=0;return a;}int d=exgcd(b,a%b,y,x);y-=(a/b)*x;return d;}int fpow(int a,int b,int p) {int ret=1;while (b) {if (b&1) ret=(ll)ret*a%p;a=(ll)a*a%p,b>>=1;}return ret;}int main() {//freopen("URAL 1141.in","r",stdin);int kase;scanf("%d",&kase);while (kase--) {scanf("%d%d%d",&e,&n,&c);int x,y,ph;int d=exgcd(e,ph=phi(n),x,y);assert(d==1);x=(x%ph+ph)%ph;int m=fpow(c,x,n);printf("%d\n",m);}return 0;}


阅读全文
0 0
原创粉丝点击