0
点赞
收藏
分享

微信扫一扫

分布式微服务 - 3.服务网关 - 4.Gateway

琛彤麻麻 03-14 10:00 阅读 2

一、题目描述

[蓝桥杯 2019 省 A] 填空问题E RSA 解密

二、问题简析

本问题可以分成三部分求解:

  • 1、 p p p q q q:利用唯一分解定理,参考 P1075 [NOIP2012 普及组] 质因数分解
  • 2、 e e e:利用拓展欧几里得定理,参考 P1082 [NOIP2012 提高组] 同余方程 和 拓展欧几里得算法
  • 3、 X X X:利用快速幂,参考 P1226 【模板】快速幂 和 快速幂

三、AC代码

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef unsigned long long ull;

ll n = 1001733993063167141, d = 212353, C = 20190324;

ll extgcd(ll a, ll b, ll &x, ll &y)
{
	if (b == 0)
	{
		x = 1, y = 0;
		return a;
	}
	
	ll ret = extgcd(b, a % b, y, x);
	y -= (a / b) * x;
	
	return ret;
}

ll quickmi(ll x, ll n, ll m)
{
	ll ans = 1;
	while (n > 0)
	{
		if (n & 1)
			ans = (__int128)ans * x % m;
		x = (__int128)x * x % m;
		n >>= 1;
	}
	return ans;
}

int main()
{
	// 求p, q 
	ll p, q;
	for (p = 2; p * p <= n; p++)
		if (n % p == 0)
		{
			q = n / p;
			break;	
		}
	cout << "p = " << p << " "
		 << "q = " << q << endl;
	
	// 求e 
	ll MOD = (p - 1) * (q - 1), x, y;
	extgcd(d, MOD, x, y);
	ll e = (x % MOD + MOD) % MOD;
	cout << "e = " << e << endl;
	
	// 求原文X
	cout << quickmi(C, e, n) << endl; 
	
	return 0;	
}

注:

  • 1、拓展欧几里得算法的解 x x x,即 e e e,取最小正整数解。
  • 2、求快速幂时,使用 long long 会溢出,所以要采用更大的类型,如 __int128__int256

举报

相关推荐

0 条评论