2015-04-01 68 views
0

我需要生成的元組的一個無限流,其滿足方程的無限流:生成元組

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; 
} 

但是,我不能確定如何滿足上述公式。 任何幫助,這是非常感謝。

+4

這似乎是少談J​​ava語言和'Stream' API和更多_math_。 – 2015-04-01 00:56:18

+1

這似乎也寫出了最基本的部分,並把作業的困難部分留給我們。並且不要命名流'myList'。 – Teepeemm 2015-04-01 01:51:15

+1

我認爲這很難做'Stream.generate()'。你可以用Stream.iterate()來完成。想想如何使用三個嵌套循環找到等式的所有解,然後根據這個想法編寫一個實例方法'Tuple next(){...}'。然後,您可以使用Stream.iterate(新元組(0,0,0),元組::下一個);''獲得所有可能解決方案的無限流。 – 2015-04-01 02:12:44

回答

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,並得到相應的一,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是有效的解決方案