java用约数个数定理求大数的约数

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);
}
上一篇:教你 Shiro 整合 SpringBoot,避开各种坑


下一篇:以'权限系统'开篇不晓得会不会遭到鄙视