Bir Sayının Cebirsel olduğunu Kanıtlayın


10

Bu cevaptan esinlenildi (benimkini vurgulayın):

Bir oyun oynayacağız. Varsayalım x sayısı var . X ile başlıyorsunuz ve sonra sıfır dışında herhangi bir tamsayıya ekleyebilir, çıkarabilir, çarpabilir veya bölebilirsiniz. Ayrıca x ile çarpabilirsiniz . Bunları istediğiniz kadar yapabilirsiniz. Toplam sıfır olursa kazanırsınız.

Örneğin, x'in 2/3 olduğunu varsayalım . 3 ile çarpın, sonra 2 çıkarın. Sonuç sıfırdır. Sen kazandın!

X'in 7 ^ (1/3) olduğunu varsayalım . Çarp tarafından x , o zamana x yine, o Kazanmak 7. çıkarma!

X'in √2 + √3 olduğunu varsayalım . Burada nasıl kazanacağınızı görmek kolay değil. Ancak, x ile çarparsanız , 10 çıkarırsanız, x ile iki kez çarpar ve 1 eklerseniz kazanırsınız. (Bu açık değildir; hesap makinenizle deneyebilirsiniz.)

Ancak x = π ile başlarsanız kazanamazsınız. Kaç adım alırsanız toplayın, çıkarın, çarpın veya tamsayılara bölerseniz veya π ile çarptığınızda π'dan 0'a ulaşmanın bir yolu yoktur. (Bunun da açık olması gerekmez. Çok zor bir şey!)

Can2 + √3 gibi kazanabileceğiniz sayılara cebir denir . Kazanamayacağınız like gibi sayılara aşkın denir.

Bu neden ilginç? Her cebirsel sayı, tamsayılarla aritmetik olarak ilişkilidir ve oyundaki kazanan hamleler size nasıl olduğunu gösterir. Sıfıra giden yol uzun ve karmaşık olabilir, ancak her adım basittir ve bir yol vardır. Ancak aşkın sayılar temelde farklıdır: basit adımlar aracılığıyla tamsayılarla aritmetik olarak ilişkili değildir.


Esasen, yukarıda verilen soruda kullanılan adımları kullanarak oyunu verilen girdi için "kazanmak" için kullanacaksınız.

Gerçek, cebirsel bir sabit xverildiğinde, aşağıdaki izin verilen işlemleri kullanarak sayıyı sıfıra dönüştürün:

  • Bir tam sayı ekleyin veya çıkarın.
  • Sıfır olmayan bir tamsayı ile çarpın veya bölün.
  • Orijinal sabit ile çarpın x.

Girdi, tamsayılar, toplama, çıkarma, çarpma, bölme, üs alma ( **veya ^kökleri temsil etmek için üsler seçiminiz ) ve parantez içerebilen bir dizedir . Girişteki boşluklar isteğe bağlıdır, ancak çıkışta değildir. Sıfır sonucunu elde etmek için gerekli adımları çıkarmalısınız, böylece 7bir adım olarak çarpma olarak çıktı alınacaktır *7. Sonunda bir boşluk ve / veya yeni satıra izin verilir.

Örnekler

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

En kısa kod kazanır.


0Sonuçların ne kadar yakın olması gerekiyor? Yuvarlama hataları ve şamandıra hassasiyeti göz önüne alındığında, sorunlu durumları kolayca görebiliyordum ...
AdmBorkBork

2
@TimmyD İşlemleri gerçekleştirip sıfır alabilmem için cevabın kesin olması gerekiyor. Sağlanan örnekleri inceleyin. Kayan nokta aritmetiği yoktur.
mbomb007

1
√2 + √3 cebri nasıl? Eğer sayıyı kendi başına çarparsanız, 5 + 2√6 elde edersiniz ... bir şeyi kaçırmadıkça radikali asla zorlayamazsınız.
Mario Ishac

@ mbomb007 Üzgünüz, özür dilerim, OP'de bunu yakalamadı.
Mario Ishac

1
Denklem için bir çözüm x^4-10*x^2+1. Bkz Wolfram Alpha
mbomb007

Yanıtlar:


3

SageMath , 108 bayt

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

SageMathCell'de deneyin .

Açıklama:

Dizeyi sembolik olarak bir cebirsel sayı ( sage_eval()) olarak değerlendirin. Her cebirsel sayı bazı polinom a [0] + a [1] x'in sıfırdır rasyonel katsayısı a [0],…, a ^ 1 + a [2] x ^ 2 + ⋯ + a [n] x ^ n sıfırdır. [ n ] ( ). Tüm katsayıları ortak paydalarıyla çarparak tamsayılara dönüştürün ( ), ardından bu polinomu istenen çıktı formatında yazın,minpoly()numerator()

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

SageMath, 102 bayt, neredeyse

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

Tüm girişler Bu çalışmaları hariç , 0, çünkü 1 / için bir polinom α için bir polinomdur a katsayılı ters. :-(


1

Mathematica, 194 224 192 bayt

""<>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,∞}]&

İşte Mathematica'da sonsuzluğu temsil eden üç baytlık unicode karakter.

Girdi bir dize olduğundan, 13 bayt kaybolur ToExpression@ dize girdisini bir cebirsel ifade olarak yorumlayan .

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

Gibi bir şey dönecekti

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

Bir sonraki değiştirme kuralı, bunu yapısal olarak benzer bir şeye masaj yapar.

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

Bu Horner formu bir ağaç gibi görselleştirilebilir:

TreeForm

Biz OP'nin kurallarına göre sağdaki en derin yaprakla başlıyoruz.

Cases en derin seviyeden başlayarak, her bir ana düğümü ve sol yaprağını alıp bunu gibi bir tabloya birleştirerek ifadeden geçer.

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

""<> her şeyi boş dize ile birleştirir.


Bu yanlış döner -299için 5/7 + 42.
Anders Kaseorg

@ Ve bu yüzden * 7 atlar ... Eve geldiğimde iki kez kontrol edeceğim
LLlAMnYP

@AndersKaseorg bu işe yarıyor, ama şimdi 30 bayt düştüm.
LLlAMnYP
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.