数学之谜-如何用Java数值求解?

数学之谜-如何用Java数值求解?,java,algorithm,math,Java,Algorithm,Math,所以谜语是: 约翰写下了k个顺序奇数:n{1},n{2},…,n{k-1},n{k},其中n{2}=n{1}+2等等。我们知道: 前四个数的和是某个素数的四次幂,所以n{1}+n{2}+n{3}+n{4}=p{1},其中p{1}^4是一个素数。 最后五个数的和是一些素数的四次幂,所以n{k}+n{k-1}+n{k-2}+n{k-3}+n{k-4}=p{2}^4,其中p{1}是一个素数。 问题是-写了多少个数字k= 下面是我用Java解决这个问题的尝试: import java.math.BigI

所以谜语是:

约翰写下了k个顺序奇数:n{1},n{2},…,n{k-1},n{k},其中n{2}=n{1}+2等等。我们知道:

前四个数的和是某个素数的四次幂,所以n{1}+n{2}+n{3}+n{4}=p{1},其中p{1}^4是一个素数。 最后五个数的和是一些素数的四次幂,所以n{k}+n{k-1}+n{k-2}+n{k-3}+n{k-4}=p{2}^4,其中p{1}是一个素数。 问题是-写了多少个数字k=

下面是我用Java解决这个问题的尝试:

import java.math.BigInteger;
import java.util.Set;

//precalculate prime numbers
public class PrimeSieve {


 public static boolean[] calculateIntegers(int N) { 


    // initially assume all integers are prime
    boolean[] isPrime = new boolean[N + 1];
    for (int i = 2; i <= N; i++) {
        isPrime[i] = true;
    }

    // mark non-primes <= N using Sieve of Eratosthenes
    for (int i = 2; i*i <= N; i++) {

        // if i is prime, then mark multiples of i as nonprime
        // suffices to consider mutiples i, i+1, ..., N/i
        if (isPrime[i]) {
            for (int j = i; i*j <= N; j++) {
                isPrime[i*j] = false;
            }
        }
    }

    return isPrime;
  }
}
解决类:

public class Solver {
    static boolean[] isPrime = PrimeSieve.calculateIntegers(100000);

    public static void main(String[] args) {

        int minNumberCount = 5;
        int maxNumberCount = 2000;
        int startInt = 2;
        int endInt = 1000000;

        for (int numberCount = minNumberCount; numberCount < maxNumberCount+1; numberCount++) {
            System.out.println("Analyzing for " + numberCount + " numbers");

            int[] numbers = new int[numberCount];

            //loop through number sets
            for (int firstNum = startInt; firstNum < endInt; firstNum+=2) {

               //populate numbers array
                for(int j=0; j<numberCount; j++){
                    numbers[j] = firstNum + j*2;
                }

                long bottomSum=0;
                long topSum=0;

                //calculate bottom sum
                for(int iter=0; iter<4; iter++){
                    bottomSum+=numbers[iter];
                }

                //calculate top sum
                for(int iter=numberCount-1; iter>numberCount-6; iter--){
                    topSum+=numbers[iter];
                }

                //check if the sums match the sulution criteria
                if(checkPrime(quadRoot(bottomSum)) && checkPrime(quadRoot(topSum))){
                    System.out.println("SOLUTION!");

                    for (int i = 0; i < numbers.length; i++) {
                        System.out.print(numbers[i] + " ");
                    }
                    System.exit(0);
                }
            }       
        }
    }

    private static boolean checkPrime(int i){
        return isPrime[i];
    }

    private static boolean checkPrime(double i){
        return ((i % 1) == 0) && checkPrime((int) i);
    }

    private static double quadRoot(long n){
        return Math.sqrt(Math.sqrt(n));
    }

 }
在假设参数max k=2000,max n{1}=100000的情况下使用此算法,我没有找到任何解决方案。我的问题是:参数假设是错误的吗?在这个范围内没有解决方案,还是我有一些算法/数值错误,这就是我没有找到解决方案的原因


编辑:对不起-我错了-应该是奇数而不是偶数。

正如评论中所说,你的谜语没有答案


假设有一个解,那么n1+n2+n3+n4==p1^4。根据谜语的定义,我们知道n1,n2,n3,n4是偶数,因此作为偶数之和,n1+n2+n3+n4也是偶数。这就导致了p1^4是偶数的事实。我们知道两个奇数相乘只会得到一个奇数,因此p1^4=p1*p1*p1*p1*p1意味着p1必须是偶数。然而,p1是素数。唯一也是偶数的素数是2。不难看出,没有四个连续的偶数加起来等于16,因此p1不是素数。这与p1是素数的假设相矛盾,因此没有解。

如果只有偶数,那么它们的总和就是偶数。如果我理解正确,你的和必须是素数四次方的结果。考虑到和是偶数,满足条件的唯一数字是16 2*2*2*2,其中2是素数,因此4个偶数的和必须是16。现在,如果确定存在一个序列,那么求和的方法是将序列中的第一个和最后一个数字相加,然后将结果与序列中的元素数相乘,然后将相乘结果除以2。例如,2+4+6+8=2+8*4/2=10*4/2=20。类似地,对于您的示例,n{1}+n{2}+…+n{k}=n{1}+n{k}*k/2 另一方面,我使用的例子是,4个偶数20的最小和已经超过了素数16的4次方,所以是的,序列中没有有效的例子


我希望这有点道理

直接解决这个问题比编写程序更容易

第一个和是偶数,所以它必须是16,因为2是唯一的偶数素数。因此,前四个数字是1,3,5,7

五个连续奇数之和是中间数的5倍,因此必须能被5整除。因为它是素数的四次幂,所以它必须是625,所以最后五个数是121123125127129


现在确定k=65是一项容易的任务,你对问题的陈述相当草率;例如,您断言前四个数的和必须等于质数的四次方,但在rhs上have=p{1},其中p{1}是质数。当然应该是=p{1}^4?如果这种对细节的忽视已经进入了你的代码,我并不奇怪它没有找到解决方案。你说的是n1+n2+n3+n4=p1。如果n1、n2、n3、n4都是偶数,那么它们的总和将是偶数。因此p1不能是素数,因为唯一的偶数素数是2。您根本不需要使用数组。前4个的和是n+n+2+n+4+n+6或4*n+12,这意味着p^4是偶数,因此p必须是偶数,只有1个偶数素数……如果你的意思是n1+n2+n3+n4=p1^4。那么p1^4仍然必须是偶数,因为两个奇数的乘积是奇数,那么p1只能是2,如果p1是素数。因此,n1+n2+n3+n4=16。但没有连续的偶数n1、n2、n3、n4和16之和。因此,这个问题显然没有解决方案,也不需要计算机来计算……对不起,已经纠正了这个问题:p{1}^4