java用约数个数定理求大数的约数
作者:互联网
——————————————————一个大的阶乘的如何拆分成幂的积的形式?
例如20!
1、首先求出所有的小于100的质数(素数)
private static boolean isPrime(int sum){ if (sum<2) return false; for (int i =2;i < sum;i++){ if (sum%i == 0) return false; } return true; }
20!就可以表示成这些素数的n次方的和
2、求出这些质数的阶数
例如:
例如:20! 1.先求出20以内的素数,(2,3,5,7,11,13,17,19) 2.再求各个素数的阶数 e(2)=[20/2]+[20/4]+[20/8]+[20/16]=18; e(3)=[20/3]+[20/9]=8; e(5)=[20/5]=4; ... e(19)=[20/19]=1;
private static int jie(int n,int i,int temp){ int sum = 0; if (i<=n){ sum+=n/i; return sum+jie(n,i*temp,temp); } return sum; }
3、将所有的数值套入公式
private static void test11(){ BigInteger hun = BigInteger.ONE; Vector<Integer> vector = new Vector<>(); for (int i = 1; i < 21; i++) { if (isPrime(i)) vector.add(i); } System.out.println(vector); List<Integer> list = new ArrayList<>(); for (Integer integer : vector) { list.add(jie(20, integer, integer)); } for (Integer integer : list) { hun = hun.multiply(BigInteger.valueOf(integer+1)); } System.out.println(hun); }
标签:约数,20,大数,int,hun,素数,vector,integer,java 来源: https://blog.csdn.net/qq_54615431/article/details/122688855