Доведіть, що число є алгебраїчним


10

Натхненний цією відповіддю (наголос мій):

Ми пограємо в гру. Припустимо, у вас якесь число x . Ви починаєте з x, а потім можете додавати, віднімати, множувати або ділити на будь-яке ціле число, крім нуля. Ви також можете помножити на x . Ви можете робити ці речі стільки разів, скільки захочете. Якщо загальна сума стає нульовою, ви виграєте.

Наприклад, припустимо, що х дорівнює 2/3. Помножте на 3, потім відніміть 2. Результат дорівнює нулю. Ти виграв!

Припустимо, x дорівнює 7 ^ (1/3). Помножте на х , потім ще раз на х , потім відніміть 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

1
Як алгебраїка √2 + √3? Якщо помножити число на себе, ви отримаєте 5 + 2√6 ... якщо я не пропущу щось, ви ніколи не можете витіснити радикал.
Маріо Ішак

@ mbomb007 На жаль, вибачте, це не впіймало в ОП.
Маріо Ішак

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

Математика, 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,∞}]&

Ось три байтові символи unicode, що представляють нескінченність у Mathematica.

Оскільки вхід є рядком, втрачається 13 байт, ToExpression@що інтерпретує введення рядка як алгебраїчний вираз.

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

Повернув би щось подібне

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

Наступне правило заміни перетворює це на щось, що структурно схоже

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

Цю форму Хорнера можна візуалізувати як дерево:

Форма дерева

Ми, за правилами ОП, починаємо з найглибшого аркуша справа.

Cases проходить через вираз, починаючи з найглибшого рівня, беручи кожен батьківський вузол і його лівий лист і складаючи це в таку таблицю, як

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

""<> об'єднує все з порожнім рядком.


Це неправильно повертається -299для 5/7 + 42.
Андерс Касеорг

@ І значить, це упускає * 7 ... Я ще раз перевірю, як тільки я вдома
LLlAMnYP

@AndersKaseorg це працює, але зараз я на 30 байт.
LLlAMnYP
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.