숫자가 대수임을 증명


10

이 답변 (강조 광산)에서 영감을 얻었습니다 .

우리는 게임을 할 것입니다. 숫자 x 가 있다고 가정하십시오 . 당신은 시작 X 다음은 제로 제외하고, 정수, 곱하기 또는 나누기, 더하기, 빼기 할 수 있습니다. x를 곱할 수도 있습니다 . 이 작업을 원하는 횟수만큼 수행 할 수 있습니다. 합계가 0이되면 승리합니다.

예를 들어 x 가 2/3 라고 가정 합니다. 3을 곱한 다음 2를 빼십시오. 결과는 0입니다. 네가 이겼다!

x 가 7 ^ (1/3) 이라고 가정합니다 . x를 곱한 다음 x를 다시 곱한 다음 7을 빼십시오.

x 가 √2 + √3 이라고 가정합니다 . 이기는 방법을보기가 쉽지 않습니다. 그러나 x 를 곱하고 10을 빼고 x를 두 번 곱한 다음 1을 더하면 승리합니다. (이것은 명백하지 않아야하며 계산기로 시도 할 수 있습니다.)

그러나 x = π로 시작 하면 이길 수 없습니다. 걸음 수에 관계없이 정수를 더하거나 빼거나 곱하거나 나누거나 π를 곱하면 π에서 0으로 갈 수있는 방법이 없습니다. (이것은 명백하지도 않습니다. 매우 까다로운 일입니다!)

이길 수있는 √2 + √3와 같은 숫자를 대수라고 합니다. 이길 수없는 π와 같은 숫자를 초월 적이라고합니다.

왜 이것이 흥미로운가요? 각 대수는 정수와 산술적으로 관련되어 있으며 게임에서 승리 한 동작은 그 방법을 보여줍니다. 0으로가는 경로는 길고 복잡 할 수 있지만 각 단계는 간단하며 경로가 있습니다. 그러나 초월 숫자는 근본적으로 다릅니다. 간단한 단계를 통해 정수와 산술적으로 관련이 없습니다.


기본적으로 위에서 언급 한 질문에 사용 된 단계를 사용하여 주어진 입력에 대해 게임을 "승리"합니다.

실제 대수 상수가 주어지면 x다음과 같이 허용되는 연산을 사용하여 숫자를 0으로 변환하십시오.

  • 정수를 더하거나 빼십시오.
  • 0이 아닌 정수로 곱하거나 나눕니다.
  • 원래 상수를 곱하십시오 x.

입력은 정수, 덧셈, 뺄셈, 곱셈, 나눗셈, 지수 ( **또는 ^, 지수는 근을 나타내는 데 사용됨) 및 괄호를 포함 할 수있는 문자열입니다 . 입력의 공백은 선택 사항이지만 출력에는 없습니다. 0의 결과를 얻는 데 필요한 단계를 출력해야하므로 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 정답은 작업을 수행하고 0을 얻을 수 있도록 정확해야합니다. 제공된 예제를보십시오. 부동 소수점 산술이 없습니다.
mbomb007

1
√2 + √3 대수는 어떻습니까? 숫자 자체를 곱하면 5 + 2√6이됩니다. 내가 뭔가 빠지지 않는 한 급진적 인 힘을 낼 수 없습니다.
Mario Ishac

@ 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

수학, 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 바이트 유니 코드 문자는 다음과 같습니다 .

입력은 문자열이므로 ToExpression@문자열 입력을 대수 표현식으로 해석하는 13 바이트가 유실됩니다 .

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

같은 것을 반환합니다

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

다음 교체 규칙은 이것을 구조적으로 유사한 것으로 마사지합니다.

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

이 Horner 양식은 나무처럼 시각화 할 수 있습니다.

TreeForm

우리는 OP의 규칙에 따라 오른쪽에서 가장 깊은 잎으로 시작합니다.

Cases 가장 깊은 수준에서 시작하여 각 부모 노드와 왼쪽 리프를 가져 와서

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

""<> 빈 문자열로 모든 것을 연결합니다.


-299대해 잘못 반환 됩니다 5/7 + 42.
Anders Kaseorg 2016 년

@ 그리고 그래서 그것은 * 7을 생략 ... 내가 집에 돌아
오면

@ AndersKaseorg이 작동하지만 지금은 30 바이트입니다.
LLlAMnYP
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.