Algorithm 如何检查给定数字N,N^2的a是否可以表示为两个非零整数的平方和?

Algorithm 如何检查给定数字N,N^2的a是否可以表示为两个非零整数的平方和?,algorithm,math,Algorithm,Math,给定一个数N,我如何知道N^2是否可以表示为两个非零整数的平方和。例如,如果N=10,则10^2可以表示为(6^2)+(8^2)。我读过这样的数字N可以表示为4k+1,但即使是9也符合这个表达式,但81不能表示为两个整数的平方和。正确的方法是什么?听起来像毕达哥拉斯计算器 这个链接可以帮助你,所有毕达哥拉斯的三元组 您想要的数字是勾股三元组的斜边(“c”值),OEIS中的系列。那里的评论指出,一个数字是斜边,当且仅当它至少可被一个4k+1形式的素数整除。所以你可以通过得到一个数的素因子分解来检查

给定一个数N,我如何知道N^2是否可以表示为两个非零整数的平方和。例如,如果N=10,则10^2可以表示为(6^2)+(8^2)。我读过这样的数字N可以表示为4k+1,但即使是9也符合这个表达式,但81不能表示为两个整数的平方和。正确的方法是什么?

听起来像毕达哥拉斯计算器

这个链接可以帮助你,所有毕达哥拉斯的三元组


您想要的数字是勾股三元组的斜边(“c”值),OEIS中的系列。那里的评论指出,一个数字是斜边,当且仅当它至少可被一个4k+1形式的素数整除。所以你可以通过得到一个数的素因子分解来检查它是否是一个斜边,然后看看这些素数被4除后是否还有1的余数

在您的示例中,81不合格,因为它唯一的主因子是3。81可被9整除,但9不是素数。

使用此对象,如果在运行checkPi()方法a、b和c后,如果“a”和“b”不等于null,则“c”是您的数字

<?php

Class PithgorasTriplesDetector {

    /**
     * 
     * @var type 
     */
    private $a, $b, $c;

    /**
     *
     * @var type 
     */
    private $check_numbers = array();

    /**
     * 
     * @param type $c
     */
    public function __construct($c) {
        $this->c = $c;
        $this->check_numbers = range(1, $this->c);
    }

    /**
     * 
     * @return boolean
     */
    public function checkPi() {
        $counter = count($this->check_numbers);
        $c_pow = pow(2, $this->c);
        for ($index = $counter - 1; $index >= 0; $index--) {
            for ($index2 = $index; $index2 > 0; $index2--) {
                if ($this->calcAB($index, $index2) == $c_pow) {
                    $this->a = $index;
                    $this->b = $index2;
                    return true;
                }
                if ($this->calcAB($index, $index2) > $c_pow) {
                    continue;
                } else {
                    return false;
                }
            }
        }
    }

    /**
     * 
     * @param type $a
     * @param type $b
     * @return type
     */
    public function calcAB($a, $b) {
        return pow(2, $a) + pow(2, $b);
    }

    function getA() {
        return $this->a;
    }

    function getB() {
        return $this->b;
    }

    function getC() {
        return $this->c;
    }

    function setA($a) {
        $this->a = $a;
    }

    function setB($b) {
        $this->b = $b;
    }

    function setC($c) {
        $this->c = $c;
    }

}

Er,81=9²+0²……但是4k+1是关于数字本身,所以9的答案应该是3²+0²。他需要大于0。一个封闭的副本:@LưuVĩnhPhúc实际上不是一个副本,因为“n^2是两个平方的和”允许“n是两个平方的和”的优化不:)我已经看过了,但它不起作用,因为N可能大到10^6