证明数字是代数的


10

受此答案启发(重点是我的):

我们将玩游戏。假设您有一些数字x。您可以从x开始,然后可以加,减,乘或除以除零以外的任何整数。您还可以乘以x。您可以根据需要多次执行这些操作。如果总数变为零,则您赢了。

例如,假设x为2/3。乘以3,然后减去2。结果为零。你赢了!

假设x为7 ^(1/3)。乘以x,然后再乘以x,然后减7。您赢了!

假设x为√2+√3。在这里,要赢得胜利并不容易。但是事实证明,如果您乘以x,然后减去10,再乘以x两次,再加上1,那么您就赢了。(这似乎并不明显;您可以使用计算器进行尝试。)

但是,如果您从x =π 开始,您将无法获胜。如果您对整数进行加,减,乘或除,或与π相乘,则无论采取多少步,都无法从π变为0。(这也不应该很明显。这是非常棘手的事情!)

像√2+√3这样的数字可以被赢得,称为代数。像π这样无法赢得的数字称为先验数字。

为什么这很有趣?每个代数数字都与整数算术相关,游戏中的获胜手法向您展示了如何做到这一点。到达零的路径可能很长且很复杂,但是每个步骤都很简单,并且有一条路径。但是,先验数在本质上是不同的:通过简单的步骤,它们与整数没有算术关系。


本质上,您将使用上面引用的问题中使用的步骤为给定的输入“赢得”游戏。

给定一个实数代数常量x,请使用以下允许的运算将数字转换为零:

  • 加或减整数。
  • 用非零整数乘或除。
  • 乘以原始常数x

输入是一个字符串,其中可以包含整数,加法,减法,乘法,除法,乘幂(您对**或的选择^,指数用于表示根)和括号。输入中的空格是可选的,但输出中的空格则是可选的。您应该输出获得零结果所需的步骤,因此乘以7一个步骤将输出为*7。允许尾随空格和/或换行符。

例子

0               ->  +0 (or any other valid, or empty)
5/7 + 42        ->  -42 *7 -5 (or shorter: *7 -299)
2^(1/3)         ->  *x *x -2
5*(3**(1/4))    ->  *x *x *x -1875
2^(1/2)+3^(1/2) ->  *x -10 *x *x +1

最短的代码获胜。


0结果需要接近多少?鉴于舍入误差和浮点精度,我很容易看到有问题的情况……
AdmBorkBork

2
@TimmyD答案必须准确,以便我可以执行操作并获得零。查看提供的示例。没有浮点运算。
mbomb007 '16

1
√2+√3的代数如何?如果您自己乘以数字,您将得到5 +2√6...除非我缺少某些东西,否则您永远也无法淘汰激进派。
Mario Ishac '16

@ mbomb007,抱歉,我没在OP中看到这一点。
Mario Ishac '16

1
这是方程式的解x^4-10*x^2+1。参见WolframAlpha
mbomb007 '16

Answers:


3

SageMath,108字节

def f(s):p=map('{:+} '.format,numerator(minpoly(sage_eval(s)/1)));return'*'+p[-1][1:]+'*x '.join(p[-2::-1])

在SageMathCell上尝试一下

说明:

以符号形式将字符串评估为代数数字(sage_eval())。每个代数数都是某个多项式的零[ a ] [0] + a [1] x ^ 1 + a [2] x ^ 2 + a + a [n] x ^ n具有有理系数a [0],…,a [ n ](minpoly())。将所有系数乘以它们的公分母将它们转换为整数(numerator()),然后以所需的输出格式编写此多项式,

*a[n] +a[n-1] *x +a[n-2] *x … *x +a[1] *x +a[0]

SageMath,102个字节,几乎

lambda s:(lambda a,*p:'*%d'%a+'*x'.join(map(' {:+} '.format,p)))(*numerator(minpoly(1/sage_eval(s))))

这适用于所有的输入,除了 0,因为对于1 /多项式α为多项式α与系数反转。:-(


1

Mathematica, 194 224 192字节

""<>Cases[HornerForm@MinimalPolynomial[ToExpression@#,x]//.{Times->t,x^a_:>Fold[#2~t~#&,x~Table~a],a_~t~b_~t~c_:>a~t~t[b,c]},a_~b_~_:>{b/.t:>"*"/.Plus:>If[a>0,"+",""],ToString@a," "},{0,∞}]&

是代表Mathematica中无穷大的三字节unicode字符。

由于输入是字符串,因此会丢失13个字节,将ToExpression@其解释为代数表达式。

HornerForm@MinimalPolynomial[2^(1/2)+3^(1/2), x]

将返回类似

1 + x^2 (-10 + x^2)

下一条替换规则将其按摩成结构类似

1 + (x * (x * (-10 + (x * (x)))))

这种霍纳形式可以像一棵树一样可视化:

树形

根据OP的规则,我们从右边最深的叶子开始。

Cases 遍历表达式,从最深层开始,获取每个父节点及其左叶,并将其组装到表中,例如

"*" "x"   " "
""  "-10" " "
"*" "x"   " "
"*" "x"   " "
"+" "1"   " "

""<> 将所有内容与空字符串连接在一起。


这错误地返回-2995/7 + 42
Anders Kaseorg '16

@因此它省略了* 7 ...我回家
后将

@AndersKaseorg可以,但是现在我要减少30个字节。
LLlAMnYP'6
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.