解决丢番图方程

时间:2013-10-01 20:24:07

标签: java

我正在研究数论中的一个问题,这个问题要求我解决一个相当复杂的丢番图方程。我们称这个等式为 f(r1,r2,...,rk)。等式中变量的数量本身是可变的。这是我开始编程的地方。

我希望编写一个java方法,其签名如下所示:

  

int [] getExponents(int n,int k,int max);

这里,参数 k 等于我们的Diophantine方程 f(r1,...,rk)中的参数个数。

此方法应为 r1,...,rk 的所有组合评估 f(r1,...,rk),使 0< r1< r2< ......< rk< max ,其中 max 是我们的方法签名中给出的agrument。

如果我们发现 r 这样 n = f(r1,...,rk)那么我们希望返回 r1,.. 。,rk 作为整数数组。 (值 n 在我们的方法签名中给出。)

我怀疑这个方法会使用递归。不幸的是,我的编程技巧或耐心都不足以找到它。

如果有人能为我概述这样的方法,我将不胜感激。

3 个答案:

答案 0 :(得分:1)

这是一个非常好的outline of a method。 (请参阅该答案的接受答案。)如果您有任何其他问题,您必须更加具体。

答案 1 :(得分:1)

基本函数可能看起来像这样,假设f(int r[])是评估等式的函数的签名。

  int[] getExponents( int n, int k, int max ){
    int[] result = new int[k];
    for(int i=0; i<k; i++)
      result[i]=i+1;
    do{
      if(f(result)==n)
        return result;
    }while(updateExponents(result,max));          
    return null;
  }

然后你需要一个函数boolean updateExponents(result,max)来迭代0max之间增加的整数序列。像这样:

  private boolean updateExponents(int[] result, int max) {
    int k = result.length;
    for(int i=k-1; i>=0; i--){
      if(result[i]< max-(k-i))
      {
        result[i]++;
        for(int j=i+1; j<k; k++)
          result[j]=result[j-1]+1;
        return true;
      }
    }
    return false;
  }

免责声明:此代码可能包含错误,我没有对其进行测试甚至运行,但它至少应该是一个很好的起点。

答案 2 :(得分:0)

以下是如何考虑处理递归。 (它不适用于丢番图方程;这适用于需要找到所有这些整数序列的其他情况。)

问题是找到k整数r的所有序列,使得0 <0。 r1&lt; r2&lt; ......&lt; rk&lt;最大

好吧,首先选择r1。可能性为1,2,...,max - 1(实际上你可以在max - 1之前停止。你将会循环并尝试每一个。

对于每个r1,您已将其减少为一个新问题:查找k-1个整数r2,r3,...,rk的所有序列,使得r1 [fixed]&lt; r2&lt; r3&lt; ......&lt; rk&lt;最大。这看起来很像原始问题吗?嗯,这是你的递归。唯一不同的是下限是0以外的其他东西。所以你的递归例程需要一个下限参数(第一次被调用时为0)和k参数,它将是{ {1}}第一次调用,然后是kk-1等。

现在你必须弄清楚当你到底时要做什么。如果k-2为1,则无需再次调用递归例程。你只需要对你收集的所有数字做一些事情。因此,为此,您需要维护一个整数数组。这个数组将从空开始。但是当第一级递归找到整数k时,您将向数组添加r1。然后第二级需要追加 r1到数组;这意味着你的递归方法需要一个参数来保存到目前为止找到的整数数组。每次调用该方法都会获得一个“到目前为止找到的整数”的数组,并且在递归调用自身时将使用该数组并附加一个新的整数。当你到达底层时,你将拥有一个完整的整数数组,然后你可以测试你的丢番图方程,做你想做的整数整数。

希望这会让你开始。