JavaScript趣题:丢番图方程

来源:互联网 发布:单片机c语言求质数 编辑:程序博客网 时间:2024/05/19 06:50

在数学中,丢番图方程是一种多项式方程,通常存在两个或多个未知数,要求出它们的整数解。

已知如下的丢番图方程,求它所有的正整数解。

x² - 4y²= n

xy是未知数,n是一个给定的常量。x,y的解集将使用如下的嵌套数组展示:

[[x1, y1], [x2, y2] ....]

下面是一些例子:

sol_equa(90005) -->  [[45003, 22501], [9003, 4499], [981, 467], [309, 37]]

 

sol_equa(90002) --> []

咋们来看看怎么解决这个问题,先看这个等式的左边,x²- 4y²,你第一眼就有种感觉,它可以转化为(x - 2y) * (x + 2y),当你想到这一步,就迈出了第一步。

因为等式右边的常量N,它有可能是一个很大的数,如果用穷举法,效率是很低的。

我们可以尝试分解这个常量,把它因式分解成两项。

比方说,N=24,分解成两项有如下的可能:

[1,24] , [2,12] , [3,8] , [4,6]

我们拿这些可能往式子上套:

x - 2y = 1

x + 2y = 24

--------------

x - 2y = 2

x + 2y = 12

......

这样就转化成了求二元一次方程。

最后,我们选取其中的正整数解即可。

function solequa(n) {    var result = [];    for(var a=1,b=n;a<=b;a++){        if(n % a == 0){            b = n / a;            var x = (a + b) / 2;            var y = (b - a) / 4;            if(parseInt(x) == x && parseInt(y) == y && x >=0 && y >= 0){                result.push([x,y]);            }        }    }    return result;}

0 0
原创粉丝点击