素数分解解密

时间:2018-12-15 00:32:00

标签: java encryption prime-factoring

我有一个程序应该将数字解密为素数。质数也有一个顺序:例如,2是第一个质数,3是第二个5是第三个,依此类推。索引是1代表a,2代表b,3代表c,依此类推。我不知道如何比较两个数组列表,以便为每个素数分配一个索引,因此我可以解码一个以数字72216017加密的单词。数字72216017具有素数17,19,47,67,71 。如果2,3,5,7,11 ...是a,b,c,d,e ...这五个素数组成了虚词一词,我只是不知道该如何分配和排序这些数字他们的索引。

package name;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class PrimeFactorsEffective {
    private static int z;
    private int w = z;

    public static List<Integer> primeFactors(int numbers) {
        int n = numbers;
        List<Integer> factors = new ArrayList<Integer>();
        for (int i = 2; i <= n / i; i++) {
            while (n % i == 0) {
                factors.add(i);
                n /= i;
            }
            if (n > 1) {
                factors.add(n);
                System.out.println(factors);
                z = Collections.max(factors);
            }
        }
        return factors;
    }

    public static void main(String[] args) {
        System.out.println("Primefactors of 72216017");
        for (Integer integer : primeFactors(72216017)) {
            System.out.println(integer);
        }
        List<Integer> factors1 = new ArrayList<Integer>();
        List<String> index1 = new ArrayList<String>();
        int i;
        int element = 0;
        int num = 0;
        int maxCheck = z; // maxCheck limit till which you want to find prime numbers
        boolean isPrime = true;
        String primeNumbersFound = "";


        //Start loop 1 to maxCheck
        for (i = 1; i <= maxCheck; i++) {
            isPrime = CheckPrime(i);
            if (isPrime) {
                primeNumbersFound = primeNumbersFound + i + " ";
                factors1.add(i);
                factors1.get(num);
            }
        }
        System.out.println("Prime numbers from 1 to " + maxCheck + " are:");
        System.out.println(factors1);
    }

    public static boolean CheckPrime(int numberToCheck) {
        int remainder;
        for (int i = 2; i <= numberToCheck / 2; i++) {
            remainder = numberToCheck % i;
            if (remainder == 0) {
                return false;
            }
        }
        return true;
    }
}

1 个答案:

答案 0 :(得分:2)

您可以将素数存储在List中(此列表中的素数将按升序排列)。现在,您可以使用Collections.BinarySearch获取想要查找其对应字母的素数的索引。一旦获得索引(根据这里的索引,您将从1开始,因此a的索引为1,b的索引为2,c的索引为3,依此类推on),您可以简单地执行类似char currentCharacter = (char) ('a' + primeIndex - 1)的操作,变量currentCharacter将存储与primeIndex对应的字母。

我想建议的其他一些小事情:

  1. 在检查数字是否为质数时,只需检查numberToCheck的平方根即可。因此,您可以将循环for (int i = 2; i <= numberToCheck / 2; i++)替换为for (int i = 2; i*i <= numberToCheck; i++)。请注意,使用Math.sqrt计算平方根不是一个好主意,相反,您可以使用类似i*i <= numberToCheck的条件。
  2. 请不要命名似乎是随机的软件包。
  3. 从Java SE 7开始,在初始化列表时不需要显式类型参数。您可以将List<Integer> factors1 = new ArrayList<Integer>()替换为List<Integer> factors1 = new ArrayList<>()。请阅读this了解更多信息。
  4. 您的因子方法对我而言看起来并不好,它无法给出正确的结果。请参阅以下提供正确结果的方法:

{{

public static List<Integer> primeFactors(int numbers) {
    int n = numbers;
    List<Integer> factors = new ArrayList<>();
    for (int i = 2; n>1; i++) {
        while (n % i == 0) {
            factors.add(i);
            n /= i;
        }
    }
    z = Collections.max(factors);
    return factors;
}