质数加密

public class EncryptionUtil {

	//偏移量-100内的质数
	private static final int[] offset = {2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97};
	/**
	 * 加密
	 * @param text
	 * @return
	 */
	public static String encode(String text){
		int distance_period = offset.length;
		char[]cs = text.toCharArray();
		char[]cs2 = new char[cs.length];
		for (int i = 0; i < cs.length; i++) {
			if(i+1>distance_period){
				int remainder = (i+1)%distance_period;
				cs2[i]=(char)(cs[i]+offset[remainder]);
			}else{
				cs2[i]=(char)(cs[i]+offset[i]);
			}
		}
		return new String(cs2);
	}
	/**
	 * 解密
	 * @param text
	 * @return
	 */
	public static String decode(String text){
		int distance_period = offset.length;
		char[]cs = text.toCharArray();
		char[]cs2 = new char[cs.length];
		for (int i = 0; i < cs.length; i++) {
			if(i+1>distance_period){
				int remainder = (i+1)%distance_period;
				cs2[i]=(char)(cs[i]-offset[remainder]);
			}else{
				cs2[i]=(char)(cs[i]-offset[i]);
			}
		}
		return new String(cs2);
	}
	/**
	 * 合数composite提取约数approximate
	 * 约数公因子:肯定是质数,只需考虑除了2以外的奇数
	 * @param x
	 * @return
	 */
	public static Integer[] getFactors(int x){
		double max = (x+1.0)/2;
		List<Integer> list = new ArrayList<Integer>();
		int i = 2;
		while (i<max) {
			int remainder = x%i;
			if(remainder==0){
				int quotients = x/i;
				x=quotients;
				list.add(i);
				continue;
			}
			if(i>2){
				i+=2;
			}else{
				i++;
			}
		}
		Integer[]t = new Integer[list.size()];
		t = list.toArray(t);
		return  t;
	}
	/**
	 * 是否质数
	 * @param x
	 * @return
	 */
	public static boolean prime(int x){
		if(x==2){
			return true;
		}
		if(x%2==0){
			return false;
		}
		double max = x/2.0;
		for (int i = 3; i < max; i+=2) {
			int remainder = x%i;
			if(remainder==0){
				return false;
			}
		}
		return true;
	}
	
	public static void main(String[] args) {
		
		String text = "根据会议日程安排,成员国元首先举行小范围。";
		System.out.println(encode(text));
		System.out.println(decode(encode(text)));
		//质数除了2都是奇数,
//		int n = 2;
//		System.out.println(prime(n));
//		Integer s[] = getFactors(n);
//		for (int i : s) {
//			System.out.println(i);
//		}
		//一亿里面每一百个数中质数的数量  //	1671800-1671900=0
//		for (int j = 1; j < 1000000; j++) {
//			List<Integer> list = new ArrayList<Integer>();
//			int start = (j-1)*100;
//			int end = j*100;
//			for (int i = start; i < end; i++) {
//				if (prime(i)) {
//					list.add(i);
//				}
//			}
//			if(list.size()<3){
//				System.out.println(start+"-"+end+"="+list.size());
//			}
//		}
		

	}
}

猜你喜欢

转载自itace.iteye.com/blog/1971946