当前位置: 首页 > 知识库问答 >
问题:

优化素数的计算[重复]

西门正平
2023-03-14

我正在尝试欧拉项目的问题3,我的算法太慢了。有人知道如何优化它吗?我试图计算的数字是600851475143L。计算这个需要很长时间,所以我需要一种方法来加快计算速度。

逻辑:

>

  • 把从3到1的所有数字通读一遍
  • 对于这些数字中的每一个,通过将它们除以中间的所有数字来检查它们是否为素数,如果它们不除以任何一个,则它们为素数
  • 如果为素数,则将其添加到数组中。

    public static void problem3(long number){
    
    long number2 = number;
    long sqrtNumber = (long)Math.sqrt(number2);
    
    
    int indexNum = 1;
    boolean isPrime = false;
    
    int primeNums[] = new int[2];
    primeNums[0] = 2;
    
    //puts prime numbers into an array
    for(int y = 3; y < sqrtNumber; y++){
       isPrime=true;
       for(int theNum = 2; theNum < y; theNum++){
           //if y divides evenly by any number then it is not prime         
           if(y%theNum==0){
               //dont store in array
               isPrime=false;
               break;
           }
       }
    
       if(isPrime == true){
           //add to array
           System.out.println(y);
           //put y in the array and exapnd the array
           //System.out.println("y: " + y);
           primeNums[indexNum] = y;
    
           int[] newArray = new int[primeNums.length + 1];
           System.arraycopy(primeNums, 0, newArray, 0, primeNums.length);
    
           primeNums = newArray;
    
           indexNum++;
       }
    }
    

    **********更新**************

    我计算到了平方根,这大大加快了计算速度,但我还做了其他事情,即在forloop中添加一个break语句,一旦我发现数字不是素数,就中断。我编辑了上面的代码以反映这些更改。

    我的算法在计算素因子时仍然是错误的,所以我需要看看它,也许会提出一个新问题。

  • 共有2个答案

    杭英杰
    2023-03-14

    你可以做的第一件事是只测试可能的因子,通过你正在测试的数字的平方根,因为如果你找到一个大于平方根的因子,那么你应该找到一个小于平方根的因子。

    如果你需要额外的性能,那么使用埃拉托色尼筛子。这允许你使用以前素数的结果来减少确定较大数字是否是素数的工作。

    梁福
    2023-03-14

    你不必除以每个数字。你只需要在2和你的数字的平方根之间除以每个素数。

     类似资料:
    • 问题内容: Java编译器会优化简单的重复数学运算,例如: 我知道我可以将结果分配给if语句之前的变量,然后返回变量,但这有点麻烦。如果编译器自动识别出正在执行相同的计算,并将结果自己缓存到临时变量中,我宁愿遵守上述约定。 *编辑-我是个白痴。我试图简单/过多地提出我的问题。它不是简单的:if(x> y) 问题答案: 答案是肯定的。这称为“ 公共子表达式消除”,它是Java,C / C ++和其他

    • 问题内容: 我有一个整数数组,我想计算重复出现的元素。首先,我读取数组的大小,并使用从控制台读取的数字对其进行初始化。在数组中,我存储了重复的元素。该数组存储元素连续出现的次数。然后,我尝试搜索重复序列并以特定格式打印它们。但是,它不起作用。 我希望输出看起来像这样: 例如: 如何找到重复的元素及其计数?如何如上所示打印它们? 问题答案: 字典(Java中的HashMap)可以轻松解决此类问题。

    • HiI在网上看到了一个计算一个数的不同素因子的答案,它看起来不是最优的。所以我试图改进它,但在一个简单的基准测试中,我的变体比原始版本慢得多。 该算法计算一个数的不同质因数。最初使用一个HashSet来收集因子,然后使用size来获得它们的数目。我的“改进”版本使用了一个int计数器,并将while循环分解为if/while以避免不必要的调用。 更新:tl/dr(有关详细信息,请参阅接受的答案)

    • 这个问题真的很奇怪。 我正在将一个例程转换为SIMD指令(我对SIMD编程非常陌生),但遇到以下代码位的问题: 问题:假设有一个SIMD实现,我只是试图计算一个正确的向量进行处理,那么处理依赖于它以前的值的正确方法是什么? 反过来,类似于函数编程的折叠实现也同样有用,因为我试图理解如何更好地提升数据依赖性,而不是为了优化而进行优化。 最后,如果你能推荐一些文献,请做。不知道如何谷歌这个话题。

    • 我正在Java中研究一种创建布尔数组isPrime的方法: 其中质数用“真”标记,其余的用“假”标记。< br >同时,我还想数一数找到的素数: 基本思想是使用埃拉托斯特尼筛。到目前为止,我的方法看起来像这样: 所以我的问题是 因为筛子多次将一些非质数的值设置为“false”(例如45 bcs 3*15=45和9*5=45),所以不起作用 那么,有人知道我如何重写这个程序,以便只将所有非质数设置为

    • 问题内容: 我需要分离并计算arraylist中有多少个相同的值,并根据出现的次数进行打印。 我有一个名为digits的arraylist: 我创建了一个将每个值分开并将其保存到新数组的方法。 之后,我得到了一个名为数字的新数组。我在此数组上使用排序 和我的ArrayList看起来像这样: 它具有: 我需要根据数字的多少来打印出数字字符串,所以它看起来应该像这样:1354678290 问题答案: