RSA Factorization----POJ3892----数学题+大数

来源:互联网 发布:语音识别模块 淘宝 编辑:程序博客网 时间:2024/06/13 20:47

题目地址:http://poj.org/problem?id=3892

给你一个数N和一个K

其中N可以被两个素数P,Q分解

加了一个条件: |q - kp| <= 105

要你求出p和q

解题思路:

题目中,q<=p且 |q - kp| <= 105

所以kp-q<=105

那么kpq-q*q<=10^5*q

因为n=pq

所以kn-q*q<=10^5*q

所以q^2>=kn-10^5*q,得到这个式子就可以看出来其实q就在sqrt(kn)附近,那么我们在他附近枚举就好了

用java就可以轻松水过了

import java.math.BigInteger;import java.util.Scanner;public class Main {/** * @param args */static BigInteger n;static BigInteger k;public static void main(String[] args) {// TODO Auto-generated method stubScanner cin = new Scanner(System.in);BigInteger one = BigInteger.ONE;BigInteger two = BigInteger.valueOf(2);BigInteger zero = BigInteger.ZERO;BigInteger l,r,tmp,mid;mid=zero;while(cin.hasNext()){n = cin.nextBigInteger();k = cin.nextBigInteger();k = k.multiply(n);l = zero;r = k;while(l.compareTo(r)<=0){mid = l.add(r).divide(two);tmp = mid.multiply(mid);if(tmp.compareTo(k) == 0)break;if(tmp.compareTo(k) < 0)l=mid.add(one);elser=mid.subtract(one);}BigInteger p,q;p = mid;q = mid;while(true){if(n.mod(p).equals(zero) && !p.equals(one) && !p.equals(n)){q = n.divide(p);break;}if(n.mod(q).equals(zero)&& !q.equals(one) && !q.equals(n)){p = n.divide(q);break;}p = p.add(one);q = q.subtract(one);}if(p.compareTo(q)>0){tmp = p;p = q;q = tmp;}System.out.println(p+" * "+q);}}}




原创粉丝点击