java - 生成无限的元组流

标签 java math java-8 java-stream

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

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

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

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

但是,我不确定如何满足上述方程。 非常感谢对此的任何帮助。

最佳答案

让我们做一些研究(使用非负值)
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 是有效的解决方案

关于java - 生成无限的元组流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29381102/

相关文章:

java - 为 JellyRefreshLayout 模块导入新的 Android 模块失败

java - 我可以在运行时更改嵌入式 Tomcat 的端口吗?

java - 检查Set中是否存在java对象

Java 将 'Excel Date Serial Number' 转换为 'DateTime'

c# - 舍入 c# 给出错误答案

c# - 列出 1...n 之间的 k 个整数的所有可能组合(n 选择 k)

java - 除非展开窗口,否则 JSlider 不会显示

java - Playframework 建议导入语句不起作用?

excel - 使用公式将 10 进制转换为 36 进制

java - ZonedDateTime更改行为jdk 8/11