数が代数であることを証明する


10

この答えに触発され(私の強調):

ゲームをします。いくつかの数xがあるとします。xから始めて、ゼロ以外の任意の整数で加算、減算、乗算、または除算できます。xを掛けることもできます。これらのことは何度でも行うことができます。合計がゼロになると、勝ちます。

たとえば、xが2/3 であるとします。3を乗算してから2を減算します。結果はゼロです。あなたが勝ちます!

仮定xは 7 ^(1/3)です。乗算により、X、それまでのx再び、その後、あなたは勝つ7を引きます!

仮定xは √2+√3です。ここで勝つ方法を見ることは簡単ではありません。しかし、xを掛けて10を引き、xを 2倍して1を加えると、勝つことがわかります。(これは自明ではありません。電卓で試すことができます。)

しかし、x =πで始めると、勝つことができません。加算、減算、乗算、整数による除算、またはπによる乗算では、いくつのステップを実行しても、πから0に到達する方法はありません。(これも明白であるとは限りません。非常に注意が必要です!)

あなたが勝つことができる√2+√3のような数は代数と呼ばれます。あなたが勝つことができないπのような数は超越と呼ばれます。

なぜこれが面白いのですか?各代数は整数に算術的に関連付けられており、ゲームでの勝利の動きはその方法を示しています。ゼロへの道は長くて複雑かもしれませんが、各ステップは単純であり、道があります。しかし、超越数は根本的に異なります。それらは、簡単な手順で整数に算術的に関連しているわけではありません。


基本的に、上記の質問で使用した手順を使用して、特定の入力でゲームを「勝ち」ます。

実数の代数定数が与えられたx場合、以下の許可された演算を使用して数値をゼロに変換します。

  • 整数を加算または減算します。
  • ゼロ以外の整数で乗算または除算します。
  • 元の定数を掛けxます。

入力は、整数、加算、減算、乗算、除算、指数(**またはの選択^、指数は根を表すために使用されます)、および括弧を含む可能性のある文字列です。入力のスペースはオプションですが、出力にはありません。ゼロの結果を得るのに必要なステップを出力する必要があります。そのため7、1ステップとして乗算すると、として出力され*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 2016年

1
√2+√3代数はどうですか?数をそれ自体で乗算すると、5 +2√6...になります。私が何かを見逃していない限り、過激派を強制することはできません。
Mario Ishac 2016年

@ mbomb007おっと、申し訳ありませんが、OPではそれを認識できませんでした。
Mario Ishac 2016年

1
これは方程式の解x^4-10*x^2+1です。WolframAlpha
mbomb007を

回答:


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 [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で無限を表す3バイトのユニコード文字です。

入力は文字列であるため、13バイトが失われToExpression@、文字列入力が代数式として解釈されます。

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

のようなものを返します

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

次の置換ルールはこれを構造的に似たものにマッサージします

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

このホーナーフォームは、ツリーのように視覚化できます。

TreeForm

私たちは、OPのルールにより、右側の最も深い葉から開始します。

Cases 最も深いレベルから始めて、各親ノードとその左の葉を受け取り、これを次のようなテーブルにアセンブルして、式を調べます

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

""<> 空の文字列ですべてを連結します。


これは間違って返す-299ため5/7 + 42
Anders Kaseorg

@And * 7は省略されます...帰宅したらもう一度確認します
LLlAMnYP

@AndersKaseorgこれは機能しますが、今は30バイトダウンしています。
LLlAMnYP 2016年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.