Chứng minh rằng một số là đại số


10

Lấy cảm hứng từ câu trả lời này (nhấn mạnh của tôi):

Chúng tôi sẽ chơi một trò chơi. Giả sử bạn có một số số x . Bạn bắt đầu với x và sau đó bạn có thể thêm, trừ, nhân hoặc chia cho bất kỳ số nguyên nào, ngoại trừ số không. Bạn cũng có thể nhân với x . Bạn có thể làm những điều này nhiều lần như bạn muốn. Nếu tổng số bằng 0, bạn thắng.

Ví dụ: giả sử x là 2/3. Nhân với 3, sau đó trừ 2. Kết quả bằng không. Bạn thắng!

Giả sử x là 7 ^ (1/3). Nhân với x , rồi lại x , rồi trừ 7. Bạn thắng!

Giả sử x là √2 + 3. Ở đây không dễ để thấy làm thế nào để chiến thắng. Nhưng hóa ra nếu bạn nhân với x , trừ 10, nhân với x hai lần và thêm 1, thì bạn sẽ thắng. (Điều này không được coi là hiển nhiên; bạn có thể thử với máy tính của mình.)

Nhưng nếu bạn bắt đầu với x = π, bạn không thể thắng. Không có cách nào để có được từ π đến 0 nếu bạn cộng, trừ, nhân hoặc chia cho số nguyên hoặc nhân với số thập phân, bất kể bạn thực hiện bao nhiêu bước. (Điều này cũng không được coi là hiển nhiên. Đây là một điều rất khó khăn!)

Các số như √2 + √3 từ đó bạn có thể giành chiến thắng được gọi là đại số . Những con số như số mà bạn không thể thắng được gọi là siêu việt.

Tại sao điều này thú vị? Mỗi số đại số có liên quan một cách hợp lý với các số nguyên và các nước đi thắng trong trò chơi cho bạn thấy như thế nào. Đường dẫn về 0 có thể dài và phức tạp, nhưng mỗi bước đều đơn giản và có một đường dẫn. Nhưng số siêu việt về cơ bản là khác nhau: chúng không liên quan về mặt số học với các số nguyên thông qua các bước đơn giản.


Về cơ bản, bạn sẽ sử dụng các bước được sử dụng trong câu hỏi được trích dẫn ở trên để "chiến thắng" trò chơi cho đầu vào đã cho.

Cho một hằng số thực, đại số x, chuyển đổi số thành 0 bằng cách sử dụng các thao tác được phép sau:

  • Thêm hoặc trừ một số nguyên.
  • Nhân hoặc chia cho một số nguyên khác không.
  • Nhân với hằng số ban đầu x.

Đầu vào là một chuỗi có thể chứa các số nguyên, cộng, trừ, nhân, chia, lũy thừa (sự lựa chọn của bạn **hoặc ^, số mũ được sử dụng để biểu diễn gốc) và dấu ngoặc đơn. Không gian trong đầu vào là tùy chọn, nhưng không phải trong đầu ra. Bạn nên xuất các bước cần thiết để có được kết quả bằng 0, do đó nhân 7với một bước sẽ là đầu ra *7. Một không gian dấu và / hoặc dòng mới được cho phép.

Ví dụ

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

Mã ngắn nhất sẽ thắng.


Làm thế nào gần để 0làm kết quả cần phải được? Với các lỗi làm tròn và độ chính xác nổi, tôi có thể dễ dàng nhìn thấy các tình huống có vấn đề ...
admBorkBork

2
@TimmyD Câu trả lời cần phải chính xác, để tôi có thể thực hiện các thao tác và nhận được số không. Xem các ví dụ được cung cấp. Không có số học dấu phẩy động.
mbomb007

1
Đại số √2 + 3 như thế nào? Nếu bạn nhân số đó, bạn sẽ nhận được 5 + 2√6 ... trừ khi tôi thiếu thứ gì đó, bạn không bao giờ có thể loại bỏ được gốc tự do.
Mario Ishac

@ mbomb007 Rất tiếc, lời xin lỗi của tôi, đã không bắt được điều đó trong OP.
Mario Ishac

1
Đó là một giải pháp cho phương trình x^4-10*x^2+1. Xem WolframAlpha
mbomb007

Câu trả lời:


3

SageMath , 108 byte

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

Hãy thử nó trên SageMathCell .

Giải trình:

Đánh giá chuỗi một cách tượng trưng như một số đại số ( sage_eval()). Mỗi số đại số là một số không của một số đa thức a [0] + a [1] x ^ 1 + a [2] x ^ 2 + ⋯ + a [n] x ^ n với các hệ số hợp lý a [0], cách, a [ n ] ( minpoly()). Nhân tất cả các hệ số với mẫu số chung của chúng để biến chúng thành số nguyên ( numerator()), sau đó viết đa thức này theo định dạng đầu ra mong muốn,

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

SageMath, 102 byte, gần như

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

Điều này hoạt động cho tất cả các đầu vào ngoại trừ 0, bởi vì đa thức cho 1 / α là một đa thức cho α với các hệ số được đảo ngược. :-(


1

Toán học, 194 224 192 byte

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

Dưới đây là ba ký tự unicode đại diện cho vô cực trong Mathicala.

Vì đầu vào là một chuỗi, 13 byte bị mất trên ToExpression@đó diễn giải đầu vào chuỗi dưới dạng biểu thức đại số.

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

Sẽ trả lại một cái gì đó như

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

Quy tắc thay thế tiếp theo mát xa điều này thành một cái gì đó có cấu trúc như

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

Hình thức Horner này có thể được hình dung như một cái cây:

Cây giun

Chúng tôi, theo quy tắc của OP bắt đầu với chiếc lá sâu nhất bên phải.

Cases đi qua biểu thức, bắt đầu ở mức sâu nhất, lấy từng nút cha và lá bên trái của nó và tập hợp nó vào một bảng như

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

""<> nối tất cả mọi thứ với chuỗi rỗng.


Điều này trả lại không chính xác -299cho 5/7 + 42.
Anders Kaseorg

@ Và vì vậy, nó bỏ qua * 7 ... Tôi sẽ kiểm tra lại một lần khi tôi về nhà
LLlAMnYP

@AndersKaseorg điều này hoạt động, nhưng bây giờ tôi giảm 30 byte.
LLlAMnYP
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.