울트라 라디칼 계산


24

울트라 라디칼이란?

ultraradical 실제 개수의 또는 지참 라디칼 에서 quintic 방정식의 유일한 루트로 정의 .ax5+x+a=0

여기 에서는 초고속 함수를 나타 내기 위해 을 사용합니다. 예를 들어, 이기 때문에 입니다.UR()UR(100010)=10105+10100010=0

도전

실수를 입력으로 사용하고 초 라디칼을 반환하거나 출력하는 전체 프로그램 또는 함수를 작성하십시오.

요구 사항

표준 허점은 허용되지 않습니다. 아래 테스트 사례에 대한 결과는 6 자리 이상의 유효 숫자 여야하지만 일반적으로 프로그램은 유효한 실수 입력에 해당하는 값을 계산해야합니다.

테스트 사례

0으로 반올림 된 소수점 9 자리는 참조 용으로 제공됩니다. 일부 테스트 사례에 대해 설명이 추가되었습니다.

 a                         | UR(a)
---------------------------+---------------------
             0             |   0.000 000 000        # 0
             1             |  -0.754 877 (666)      # UR(a) < 0 when a > 0
            -1             |   0.754 877 (666)      # UR(a) > 0 when a < 0
             1.414 213 562 |  -0.881 616 (566)      # UR(sqrt(2))
            -2.718 281 828 |   1.100 93(2 665)      # UR(-e)
             3.141 592 653 |  -1.147 96(5 385)      # UR(pi)
            -9.515 716 566 |   1.515 71(6 566)      # 5th root of 8, fractional parts should match
            10             |  -1.533 01(2 798)
          -100             |   2.499 20(3 570)
         1 000             |  -3.977 89(9 393)
      -100 010             |  10.000 0(00 000)      # a = (-10)^5 + (-10)
 1 073 741 888             | -64.000 0(00 000)      # a = 64^5 + 64

승리 기준

모든 언어에서 가장 짧은 유효한 제출이 이깁니다.

답변:


12

Wolfram Language (Mathematica) , 20 바이트

Root[xx^5+x+#,1]&

온라인으로 사용해보십시오!

여전히 내장되어 있지만 적어도 그렇지 않습니다 UltraRadical.

(문자 |->Mathematica와 유사하게 표시 =>되며 JS 와 유사합니다 )


9
Mathematica를 사용하는 이유를 궁금 유지 하고 대신
아담

2
@ Adám 나는 단지 처음 두 개의 사각형을보아야합니까, 아니면 어떤 종류의 글꼴이
빠졌습니까

6
@mbrig 그냥 사각형. 그게 내 요점이야 Mathematica는 유니 코드에 대부분 문자 있더라도 개인 사용 영역의 문자를 사용 합니다.
Adám

8

Python 3.8 (시험판) , 60 바이트

f=lambda n,x=0:x!=(a:=x-(x**5+x+n)/(5*x**4+1))and f(n,a)or a

온라인으로 사용해보십시오!

뉴턴 반복 방법. x=xf(x)f(x)=xx5+x+n5x4+1

사용하는 동안 수학적으로 등가이다 영원히 프로그램 루프를 만든다.4x5n5x4+1


다른 접근법 :

Python 3.8 (시험판) , 102 바이트

lambda x:a(x,-x*x-1,x*x+1)
a=lambda x,l,r:r<l+1e-9and l or(m:=(l+r)/2)**5+m+x>0and a(x,l,m)or a(x,m,r)

온라인으로 사용해보십시오!

함수 x^5+x+a가 증가 할 때 이진 검색 . 에 대한 경계를 설정 -abs(x)하고 abs(x)충분하지만, -x*x-1x*x+1짧습니다.

BTW Python의 재귀 제한이 너무 낮아 1e-9가 필요 :=하며이를 walrus 연산자라고합니다.


선형 검색이 더 적은 바이트를 사용합니까?
user202729

8

자바 스크립트 (ES7), 44 바이트

아래와 동일한 공식을 사용하지만 반복 횟수가 고정 된 안전한 버전입니다.

n=>(i=1e3,g=x=>i--?g(.8*x-n/(5*x**4+5)):x)``

온라인으로 사용해보십시오!


자바 스크립트 (ES7),  43  42 바이트

의 근사값으로 를 사용하는 뉴턴의 방법 .5x4+5f(x)=5x4+1

n=>(g=x=>x-(x-=(x+n/(x**4+1))/5)?g(x):x)``

온라인으로 사용해보십시오!

방법?

시작하여 재귀 적으로 계산합니다.x0=0

xk+1=xkxk5+xk+n5xk4+5=xkxk+nxk4+15

이 중요하지 않을 때까지xkxk+1


부동 숫자의 동등성을 비교하는 것은 정확하지 않으므로 가능한 모든 입력에 대해 프로그램 종료를 보장 할 수 있는지 확실하지 않습니다 ( 아래Python 3 답변 은 수식을 단축하려고 할 때 이미 문제가 발생했습니다).
요엘

1
@Joel 더 안전한 버전을 추가했습니다.
Arnauld

7

젤리 , 8 바이트

;17B¤ÆrḢ

온라인으로 사용해보십시오!

작동 방식 :

  • 의 이진 표현을 [a, 1, 0, 0, 0, 1]앞에 추가 하여 목록 을 구성합니다 . 왜이 목록입니까? 그것은 우리가 찾고있는 계수에 해당하기 때문에 :a17

    [a, 1, 0, 0, 0, 1] -> P(x) := a + 1*x^1 + 0*x^2 + 0*x^3 + 0*x^4 + 1*x^5 = a + x + x^5
    
  • 그런 다음 계수 목록 (앞서 구성한 것)이 주어지면 Ær다항식을 푸는 내장 함수가 P(x) = 0있습니다.

  • 우리는 실제 솔루션에만 관심이 있으므로로 솔루션 목록의 첫 번째 항목을 사용합니다 .


6

APL (Dyalog Unicode) , 11 10 바이트 SBCS

dzaima 덕분에 -1

익명의 암묵적 접두사 기능.

(--*∘5)⍣¯1

온라인으로 사용해보십시오!

()⍣¯1 다음의 암묵적 기능을 한 번만 적용하십시오.

- 부정 된 주장

- 마이너스

*∘5 5의 힘으로 제기 된 주장

본질적으로, 이것은 묻는다 어느 수행 I는 피드에 필요한 결과가되도록 .xf(x)=xx5y


이것은 매우 시원합니다. 슬프게도 J는이 반전을 수행 할 수없는 것 같습니다
Jonah

@dzaima 왜 안‽‽ 감사합니다.
Adám

5

R , 43 바이트

function(a)nlm(function(x)abs(x^5+x+a),a)$e

온라인으로 사용해보십시오!

nlm는 최적화 함수이므로 최소 함수즉, 유일한 0입니다. 의 두 번째 매개 변수 는 초기화 지점입니다. 흥미롭게도, 마지막 테스트 사례 (아마도 숫자 정밀도로 인해 0)에서 초기화가 실패하지만 (올바른 부호조차 아님) 에서 초기화는 성공합니다.x|x5+x+a|nlma


@TheSimpliFire 수학적으로는 동일하지만 숫자 적으로는 그렇지 않습니다. 절대 값 대신 제곱을 사용하면 큰 입력에 대해 잘못된 값이 발생합니다. ( 온라인으로 사용해보십시오. )
Robin Ryder

4

R , 56 바이트

function(x)(y=polyroot(c(x,1,0,0,0,1)))[abs(Im(y))<1e-9]

온라인으로 사용해보십시오!

지적 해 주신 @Roland에게 감사드립니다 polyroot. 또한 이전 답변이 0 또는 음 복잡한 루트를 선택 했으므로 복잡한 루트를 사용 하고 필터링 하여 다시 작성했습니다 .apolyroot



@RobinRyder는 충분히 다르므로 자신의 답변을 게시해야한다고 생각합니다. 그래도 고마워!
Nick Kennedy

1
알았어 고마워. 여기 있습니다 .
로빈 라이더

"안타깝게도", polyroot모든 복잡한 근을 반환합니다. 그렇지 않으면 이길 것입니다.
롤랜드

3

J , 14 바이트

{:@;@p.@,#:@17

온라인으로 사용해보십시오!

J에는 다항식을 푸는 기능이 내장되어 있습니다. p.

마지막 4 가지 테스트 케이스는 TIO에서 시간 초과되지만 이론 상으로는 여전히 정확합니다.

방법

J의 내장에 대한 다항식 계수는 계수가 x^0첫 번째 인 숫자 목록으로 취해집니다 . 이것은 목록이 다음을 의미합니다.

a 1 0 0 0 1

1 0 0 0 1이진수로 17이므로 #:@17,로 표시 한 다음 input을 추가 한 ,다음 적용 p.하고 raze로 결과를 개봉 ;한 다음 마지막 요소를 가져옵니다.{:



2

Pari / GP , 34 32 26 24 바이트

a->-solve(X=0,a,a-X-X^5)

온라인으로 사용해보십시오!


하지만 호기심 멋진 대답은 왜합니까 s(-100010)에 결과를 -8.090... - 5.877...*I대신의 10? 대규모 테스트 사례의 경우 언어 제한 사항입니까? 추신 : 2 바이트를 모두 0.2로 변경하여 저장할 수 있습니다 .2. :)
Kevin Cruijssen

R

익명 함수를 사용할 수 있습니다 : a->solve(X=-a,a,X^5+X+a).
alephalpha

감사합니다 @alephalpha.
TheSimpliFire


2

k4, 33 31 바이트

{{y-(x+y+*/5#y)%5+5*/4#y}[x]/x}

뉴턴-그래프 슨은 숫자가 수렴 될 때까지 반복적으로 계산

편집 : ngn 덕분에 -2!


으악,이게 다 잘못 됐어 ...

K (oK), 10 바이트

{-x+*/5#x}

롤 @ngn, 부주의 ... 업데이트했다하지만 지금은 NGN / K) 또는 OK (확인 :)에서 할 너무 게으른 해요로 K4에서
낙서

시원한! 마지막 쌍은 [ ]불필요 해 보인다
ngn

흠, 맞아. 과도 / 수렴으로 인해 불필요한 / 생략 된 (하나 또는 다른 것을 잊어 버린) 대괄호로 인해 무한 루프가 발생하기 전에 이상한 동작이 발생했습니다. 그래서 내가 그들을 남겨두고 확인해야합니다. 감사!
낙서


1

C, 118b / 96b

#include<math.h>
double ur(double a){double x=a,t=1;while(fabs(t)>1e-6){t=x*x*x*x;t=(x*t+x+a)/(5*t+1);x-=t;}return x;}

원래 함수 이름과 약간의 정확도 (두 배)를 가진 118 바이트. 비트 해킹을 사용하는 것이 더 나을 수 있지만 휴대하기가 쉽지 않습니다.

고정 반복이있는 96 바이트

double ur(double a){double x=a,t;for(int k=0;k<99;k++){t=x*x*x*x;x=(4*x*t-a)/(5*t+1);}return x;}

실제로, 우리의 기능은 매우 우수하여 뉴턴의 방법에 더 잘 적응할 수 있습니다. 훨씬 빠르고 실용적인 구현 (150 바이트)은

#include<math.h>
double ur(double a){double x=a/5,f=1,t;while(fabs(f)>1e-6){t=x*x*x*x;f=(t*(5*t*x+5*a+6*x)+a+x)/(15*t*t-10*a*x*x*x+1);x-=f;}return x;}

나는 그것이 작동하는지 확인했지만 그것이 얼마나 더 빠를 지 알기에는 너무 게으르다. 뉴턴보다 적어도 하나 더 빨리 주문해야합니다.


하고 싶은 뭔가 x-=t=...를 사용할 수 있습니까?
user202729


0

클린 , 61 60 바이트

import StdEnv
$a=iter 99(\x=(3.0*x^5.0-a)/inc(4.0*x^4.0))0.0

온라인으로 사용해보십시오!

New202 의 방법은 user202729의 답변 에서 처음 구현되었습니다 .

클린 , 124 바이트

import StdEnv
$a= ?a(~a)with@x=abs(x^5.0+x+a);?u v|u-d==u=u|v+d==v=v= ?(u+if(@u< @v)0.0d)(v-if(@u> @v)0.0d)where d=(v-u)/3E1

온라인으로 사용해보십시오!

"이진"검색으로, 검색 영역을 50 %가 아닌 각 반복에서 상한과 하한 사이의 범위의 99.6 %로 좁 힙니다.




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