Javascript 方程无理性检验

Javascript 方程无理性检验,javascript,jquery,math,numbers,Javascript,Jquery,Math,Numbers,我正在做一个数字数据淋浴,它显示一个数字的数据,比如偶数或奇数。 现在我停在无理数上,我如何测试它呢 大概是这样的: alert(isIrrational(Math.sqrt(9))); 这取决于上下文,但您可能想说,非常接近简单有理数的浮点数应该被标识为有理数,否则它们应该被标识为可能的无理数。你必须为非常接近和简单的有理数选择定义 对于相对较小的数字,比如绝对值小于100的数字,你可以说简单有理数是分母较小的数字,比如2/3,比如分母小于100的数字。你对非常接近的定义可能是差异的绝对大小

我正在做一个数字数据淋浴,它显示一个数字的数据,比如偶数或奇数。 现在我停在无理数上,我如何测试它呢

大概是这样的:

alert(isIrrational(Math.sqrt(9)));

这取决于上下文,但您可能想说,非常接近简单有理数的浮点数应该被标识为有理数,否则它们应该被标识为可能的无理数。你必须为非常接近和简单的有理数选择定义

对于相对较小的数字,比如绝对值小于100的数字,你可以说简单有理数是分母较小的数字,比如2/3,比如分母小于100的数字。你对非常接近的定义可能是差异的绝对大小很小,比如10^-6以下,或者你可能要求数字接近分母平方的1000倍。在大多数情况下,这就足够了

小分母数的有理逼近理论是称为丢番图逼近的数论的一部分。您可以使用的一个工具是数字的扩展,例如 pi=3+1/7+1/15+1/1+1/292+。。。e-1=1+1/1+1/2+1/1+1/1+1/1+1/4+1/1+1/1+1/6+。。。。您可以递归地计算这些,尽管您很快就会失去精度。当你截断这样一个表达式时,你会得到一个很好的有理逼近,比如pi~3,或pi~22/7,pi~355/113,或e~193/71。这些给候选有理数与小分母是密切的。简单连分式中的大系数意味着该数具有良好的有理逼近

某些有理数将不会通过这种方式被检测为有理数,例如,如果分母使用100的阈值,则为1/500。但是,您可以将1/3.0f标识为rational,并将Math.sqrt2.0*Math.sqrt8.0标识为Math.sqrt2.0,您将拒绝使用Math.sqrt2.0

我不知道是否有一种标准的方法来确定像6.73241 x 10^31这样的大浮点的复杂性。这甚至可以是一个整数,但你没有准确度来判断。你可能会说接近平滑整数的数字很简单。光滑意味着在素因子分解中没有大素数。虽然分解大数通常是困难的,但分解平滑数并不是那么糟糕,因为您只需要测试几个可能的素因子。当您甚至无法测试附近的数字是否平滑时,您可以将该数字的对数与小素数的对数组合进行比较。这可能意味着一个大素数不会被识别为一个有理数,但如果你在意的话,记录设置的素数通常与平滑数相差1,例如2**57885161-1

在非常大的浮点数和小数之间,您可以使用某种复杂度度量,它结合了可能的分子的简单性和可能的分母的简单性。因此,对于介于10^6和10^9之间的数字,您可能会决定只允许分母最大为10,并且您可能会要求其中一个数字的差值小于10^-4

确定sqrtrational是否是非理性的相当简单。以下是如何:

用m和n个整数和互质将有理参数写成m/n,即gcdn,m=1。现在假设存在m/n的有理平方根r。如果r=s/t,带有s和t整数和互质,我们将得到:

s^2/t^2 = rˆ2 = m/n


特别地,s*s会除以m*t*t,因为s和t没有公共素数,s*s实际上会除以m。换句话说,我们会有1s*s这是一种可能性。第一步是找到下一个最小和最大的浮点值,这是导致prevFloat和nextFloat的各种赋值。在than之后,我们逐步遍历分母低于某个阈值的所有可能的有理数,在浮动之间寻找适合的对象。如果在用完潜在分母之前找不到分数,它会报告NaN。该函数最终在OmaxDenom中运行

函数为有理数{ var maxDenom=1000, 符号=数字<0?-:+, absVal=Math.absnumber, 整数=Math.floorabsVal, 分数部分=absVal整数, asBinary=SECTILPART.toString2, prevAsBinary=asBinary.replace/10*$/,函数匹配{ 返回0+Arraymatch.length.join1; }, nextAsBinary=asBinary.replace/01*$/,functionmatch{ 返回1+Arraymatch.length.0; }, prevFloat=parseFloatprevAsBinary,2, nextFloat=parseFloatnextAsBinary,2, 分子=0;
对于var分母=1;分母,所有IEEE浮点数都是有理数。sqrt2.0返回平方为2的无理数的近似值。0@dmuir所以你想确定近似值是否有一个合理的分母,比如1/3v.54608393/38613965~√2.这实际上是
一个非常有趣的问题,如果你把它表述为,给定一个有理数x,sqrtx是有理的还是无理的?当然,由于浮点值都是有理的,所以计算Math.sqrtx之类的数值近似值是没有意义的;你必须看看x的性质,回答这个问题而不必进行计算。我推测,当x是一个整数时,如果sqrtx不是一个可以用多种方法确定的整数,那么sqrtx是无理的。但我可能弄错了,你会想看看细节的。@Robert Dodier:是的,唯一素数分解扩展到有理数。如果a/b是有理数而不是整数,那么a/b^2是有理数而不是整数,因为在素数分解中有一些素数的负偶数指数。所以,只有有理数的平方的整数是整数的平方。我不明白你为什么要测试多个候选者。如果有理数的表示形式是m/n,m和n为正,互质,那么这只是有理数的平方,如果m和n为平方。测试整数是否是平方很容易。你不需要考虑m和n。如果给你一个m/n的有理数,它可能不是互质的,你可以通过除以GCD将其降到最低,这很容易用欧几里德算法找到,而欧几里德算法同样不需要分解m和n。还要注意,我修正了%的用法,因为我写了d*d%m而不是m%d*d。@DouglasZare极好的问题。你是对的。我之所以采用这种方法,是因为它可以很容易地推广到高次方程。事实上,我在这里使用的解决x^2-m/n=0的相同技术可以很容易地适用于任何多项式px=0的一般情况,前提是px的所有系数都是有理数。这都假设OP只对测试平方根是否有理感兴趣。如果他通过其他方式得到这个号码,这是行不通的。@Teepeemm。正当但还有什么别的办法?比如说,如果你得到一个浮点数,你就无法知道它是否代表了其他的量。您必须提供数字的结构,以确定其合理性。
n * s * s = m * t * t
m * s * s = n * t * t
`d = 1` Yes, `100 % (1 * 1) = 0`
`d = 2` Yes, `100 % (2 * 2) = 0`
`d = 3` No, `100 % (3 * 3) = 1`
`d = 4` No, `100 % (4 * 4) = 4`
`d = 5` Yes, `100 % (5 * 5) = 0`
`d = 6` No, `100 % (6 * 6) = 28`
`d = 7` No, `100 % (7 * 7) = 2`
`d = 8` No, `100 % (8 * 8) = 36`
`d = 9` No, `100 % (9 * 9) = 19`
`d = 10` Yes, `100 % (10 * 10) = 0`
End: `11 * 11 > 100`.
`d = 1`, Yes
`d = 2`, No (remainder = 1)
`d = 3`, Yes
`d = 4`, No (remainder = 1)
`d = 5`, No (remainder = 6)
`d = 6`, No (remainder = 9)
`d = 7`, No (remainder = 32)
`d = 8`, No (remainder = 17)
`d = 9`, Yes
End: `10 * 10 > 81`.
(1, 1), (2, 1), (5, 1), (10, 1)
(1, 3), (2, 3), (5, 3), (10, 3)
(1, 9), (2, 9), (5, 9), (10, 9)