我需要生成一个无限的元组流,它满足等式:
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;
}
但是,我不确定如何满足上述等式。 对此有任何帮助非常感谢。
答案 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
是有效的解决方案