编写一个自包含的程序,当给定一个多项式和一个界限时,它将发现该多项式的所有实根都达到不超过界限的绝对误差。
约束条件
我知道Mathematica以及其他一些语言都有一个符号解决方案,这很无聊,因此您应该坚持原始操作(加,减,乘,除)。
输入和输出格式具有一定的灵活性。您可以通过stdin或命令行参数以任何合理的格式进行输入。您可以允许浮点数,或者要求使用某些有理数表示形式。您可以采用边界或边界的倒数,如果您使用的是浮点,则可以假定边界不小于2 ulp。多项式应表示为一个单项式系数列表,但可以是大端或小端的。
尽管没有必要提供完整的内联证明,但是您必须能够证明您的程序为何始终可以工作的原因(模数问题)。
该程序必须处理具有重复根的多项式。
例
x^2 - 2 = 0 (error bound 0.01)
输入可以是例如
-2 0 1 0.01
100 1 0 -2
1/100 ; x^2-2
输出可以是例如
-1.41 1.42
但不是
-1.40 1.40
因为那有大约0.014的绝对误差...
测试用例
简单:
x^2 - 2 = 0 (error bound 0.01)
x^4 + 0.81 x^2 - 0.47 x + 0.06 (error bound 10^-6)
多根:
x^4 - 8 x^3 + 18 x^2 - 27 (error bound 10^-6)
威尔金森的多项式:
x^20 - 210 x^19 + 20615 x^18 - 1256850 x^17 + 53327946 x^16 -1672280820 x^15 +
40171771630 x^14 - 756111184500 x^13 + 11310276995381 x^12 - 135585182899530 x^11 +
1307535010540395 x^10 - 10142299865511450 x^9 + 63030812099294896 x^8 -
311333643161390640 x^7 + 1206647803780373360 x^6 -3599979517947607200 x^5 +
8037811822645051776 x^4 - 12870931245150988800 x^3 + 13803759753640704000 x^2 -
8752948036761600000 x + 2432902008176640000 (error bound 2^-32)
注意:此问题在沙盒中存在大约3个月。如果您认为需要在发布之前进行改进,请访问“沙箱”并在其他建议的问题发布到Main之前对其进行评论。
fractions.Fraction
(有理数类型)?(c)我们是否必须处理小于1的多项式?(d)我们可以假设超前系数为1吗?