生成无限的元组流

时间:2015-04-01 00:54:20

标签: java math java-8 java-stream

我需要生成一个无限的元组流,它满足等式:

  

2 * a * a + b * b = c * c

我刚开始使用java 8,我不确定如何实现这一目标。 我有一个元组接口:

public interface Tuple {
    /**
     * @return The value of A
     */
    int getA();

    /**
     * @return The value of B
     */
    int getB();

    /**
     * @return The value of C
     */
    int getC();
}

到目前为止,我有这种方法:

public static Stream<Tuple> generateABCTuples() {
    Supplier<Tuple> aTuple = (Supplier<Tuple>) generateABCTuples();
    Stream<Tuple> myList = Stream.generate(aTuple)
                                 .sorted();
    return myList;
}

但是,我不确定如何满足上述等式。 对此有任何帮助非常感谢。

1 个答案:

答案 0 :(得分:1)

让我们做一点研究(使用非负值)
2*a^2+b^2=c^2
2*a^2 = c^2 - b^2 = (c-b)*(c+b)
我们可以看到b和c必须都是奇数或两者都是偶数。无论如何,右边部分可以被4整除,所以左边也可以被4整除,a是偶数。 另一个条件:c >= b
我们

a = 2*p
u=(c-b)/2
v=(c+b)/2 [with v>=u]     

所以

b=v-u  
c=v+u
8*p^2 = 4 * u * v
2*p^2 = u * v  

现在我们可以取p的任何值,分解2 * p ^ 2,找出可能的因子u和v,并得到相应的a,b,c值(可能不是唯一的)。 例如:

p=0  =>  u=0, v=any value, all c=b pairs are the solutions 2*0+k^2=k^2
p=1  =>  v=2, u=1  a=2 b=1 c=3   2*4+1=9  
p=2  =>  v=8, u=1  a=4 b=7 c=9   2*16+49=81  //and the second factorization:
         v=4, u=2  a=4 b=2 c=6    2*16+4=36
and so on...

当然,每个三元组元素都可能是负数:a=-2 b=1 c=-3是有效的解决方案