대략적인 플라스틱 수


24

도전

플라스틱 수 많은 흥미로운 수학적 특성을 가진 황금 비율에 관련된 숫자입니다. 따라서 숫자를 계산하는 데 사용할 수있는 많은 방법이 있습니다.

이 과제의 목적을 위해 숫자를 정확하게 지정하기 위해 다음과 같은 정의를 사용합니다 (동일한 정의가 많더라도 원하는 숫자를 같은 숫자로 사용할 수 있음).

소성 숫자는 실수 ρ 이므로 ρ ³ = ρ +1입니다.

내 도전 정수 얻어 프로그램이나 함수를 작성하는 , X가 (로 입력으로서 X > 1)가 근사치를 생성 ρ 의 값이 클수록되도록, 출력으로서 X는 얻는다 가까운 출력에 도달 ρ를 ( 대부분의 유한 한 많은 예외로하여,이 목적을 위해 "더 가까이"와 같은 값 카운트에서 체류) 및 양수에 대한 δ , 일부 입력있다 X 내에서 출력이의 생산 프로그램에 δρ를 .

설명

  • 기본적으로 문자열을 출력하는 방법 (예 : 표준 출력 스트림)을 통해 출력하는 경우 10 진수 (예 :) 1.3247179572또는 /문자 사이 의 문자 를 갖는 두 정수의 비율로 출력을 형식화 할 수 있습니다.
  • 프로그래밍 언어 내에서 값으로 출력하는 경우 (예 : 함수에서 반환) 고정 소수점, 부동 소수점 또는 합리적인 유형이어야합니다. (특히 두 정수의 비율을 유지하는 데만 사용되지 않는 한 숫자를 기호로 저장하는 데이터 유형을 사용할 수 없습니다. 따라서 Mathematica 또는 유사한 언어를 사용하는 경우 추가를 포함해야합니다. 실제로 출력의 숫자를 생성하는 코드입니다.)
  • 답은 정수가 임의로 클 수 있고 메모리 (스택 포함)가 무제한 인 가상의 언어 변형에서 작동해야합니다. 당신은 할 수 없는 언어에서 그 부동 소수점 연산 임의로 정확 가정, 대신 (부동 소수점 숫자를 출력하는 경우에만 부동 소수점 숫자의 정확성이 될 수있는 언어로 가능 위하여려고하고 있다는 것을 의미한다 실제 정확성을 사용해야합니다 런타임에 제어 됨).
  • x 는 원하는 의미를 가질 수 있습니다 (확장할수록 더 정확한 출력을 제공하는 한). 나는 대부분의 제출물이 생성 할 출력 자릿수 또는 프로그램이 플라스틱 수에 수렴하기 위해 사용하는 알고리즘의 반복 횟수를 제어해야한다고 생각하지만 다른 의미는 허용됩니다.

테스트 케이스

플라스틱 번호의 처음 몇 자리는 다음과 같습니다.

1.32471795724474602596090885

OEIS에서 더 많은 숫자를 사용할 수 있습니다 .

승리 조건

와 마찬가지로 바이트 단위로 짧을수록 좋습니다. 그러나 기존 답변에 다른 언어 (예 : 다른 언어 또는 다른 알고리즘)를 추가하는 한, 당첨되지 않더라도 답변을 게시 할 수 있습니다.


1
흠, (cbrt (108 + 12 * sqrt (69)) + cbrt (108-12 * sqrt (69))) / 6 이것은`Drake approximation ': sqrt (69) = 8을 사용하기에 좋은시기 인 것 같습니다. 뭔가 bit.ly/2rCqedX ^ _ ^
DrQuarius

2
재귀 / 스택 깊이가 무제한이라고 가정 할 수 있습니까?
xnor

두 번째 요점을 명확히하기 위해 임의 정밀도 라이브러리 (예 : 파이썬의 mpmath)를 사용할 수 있습니까? 보조 데이터 유형을 사용하지만 "기호 적으로"저장하는 것으로 계산합니까?
배트맨

1
글쎄, 적어도 나는 대답이 ρ 로 수렴 될 것으로 기대합니다 . 또한 "정직한"솔루션은 테스트 x> y-> | ρx-ρ | > | ρy-ρ | 유한 한 (x, y) 쌍의 경우. 그것이 받아 들일 수 없다면, 이것은 사양에서 더 명확하게 만들어야한다고 생각합니다.
Dennis

6
많은 응답자들이 x 자리 근사값을 ρ로 계산하는 함정에 빠졌는데, 문제는 (x + 1) 자리 근사값이 x 자리 근사치보다 나을 정도로 무한히 많은 x가 있다는 것입니다. 아마도 이것이 허용되도록 의도했는지 명확히해야합니다. 그렇지 않은 경우 "closer"를 "stricter"로 바꾸십시오. 당신이 "적어도 가까이", 또는 뭔가를하는 경우. 또한 시퀀스 가 ρ로 수렴 해야하는 느슨한 요구 사항을 고려할 수 있으므로 xnor의 답변이 추가로 허용됩니다.
Anders Kaseorg

답변:


10

파이썬 2 , 49 바이트

n=x=input()
while n**3/x/x<n+x:n+=1
print n,'/',x

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

아이디어는 분모 가 입력 정확도 매개 변수 인 분수 로 로 표현하는 것 ρ입니다 . 우리는 분모를 취하고 지 웁니다 .ρ³=ρ+1n/xx(n/x)³=n/x+1n³=x²(x+n)

LHS n는 RHS보다 빠르게 증가하기 때문에로 평등 점 n을 가장 작은 것으로 추정 할 수 있습니다 n³≥x²(x+n). 이 n경우가 시작될 때까지 코드가 카운트 업 x됩니다.

작은 바이트 저장은 양 측면 을 쓰기 로 나누는 것입니다 n³/x²≥x+n( while조건 에서 부정 됨 ). 이것은 코드에서 바닥 분할이지만 손실 된 소수 부분은 무시할 수 있습니다.

같은 길이의 대안 x이 분자로 대신 사용됩니다 .

파이썬 2 , 49 바이트

n=x=input()
while x**3/n/n<n+x:n-=1
print x,'/',n

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


이 출력은 ρ (∀ε> 0 ∃x₀ ∀x ≥ x₀ | f (x) − ρ | <ε)로 수렴하지만“x의 값이 클수록 출력이 ρ에 가까워집니다. (최대한 많은 예외가 있음)”(∃x₀∀x ≥ x₀ | f (x + 1)-ρ | <| f (x)-ρ |).
Anders Kaseorg

이 문제는 2**input()단순히 사용 하는 것이 아니라 사용하여 해결할 수 있습니다 input(). 그러면 각 근사값은 이전의 정확도만큼 정확하지 않습니다.

10

Mathematica, 20 바이트

#^3-#-1&~Root~1~N~#&

Mathematica의 내장 Root함수는 다항식에 솔루션을 제공합니다 f[x] == 0.

설명

#^3-#-1&~Root~1~N~#&
                   &  (* Function *)
#^3-#-1&              (* A pure-function polynomial, x^3-x-1 *)
        ~Root~1       (* Find the first root *)
               ~N~#   (* approximate to (input) digits *)

샘플 I / O

In[1]:= f=#^3-#-1&~Root~1~N~#&;
        f[1]

Out[1]= 1.

In[2]:= f[9]

Out[2]= 1.32471796

In[3]:= f[100]

Out[3]= 1.324717957244746025960908854478097340734404056901733364534015050302827851245547594054699347981787280

추신 : 같은 바이트 수에 대해 Root[x^3-x-1,1]~N~#&잘 작동합니다 ( x변수 라고 말하지 않아도 ).
Greg Martin

@AndersKaseorg : 그 규칙이 명확하게 깨 졌기 때문에 규칙을 변경했습니다. 유효한 답변이 무효화되지 않았지만 일부 답변 (예 : 이와 같은 답변)이 유효 해졌습니다.

6

수학, 27 바이트

x/.Solve[x^3==x+1>2,x]~N~#&

Martin에서 -1 바이트
ovs에서 -2 바이트

입력

[27]

산출

{1.32471795724474602596090885}


Solve[x^3==x+1>2,x]~N~#&24 바이트 동안
ovs

1
그러나 그 결과입니다 {{x -> 1.32...}}. ais에서 유효한 출력 형식인지 확인할 수 있습니다.
마틴 엔더

좋아. 모든 고정 내가 추측
J42161217

그것은 아직 {1.32...}사실,하지만 형식은 아마 덜 논쟁이다.
Martin Ender

1
나는 이것이 유효 할 수 있도록 도전을 좀 더 일반적으로 만들었습니다. 그것은 "첫 x 자리"솔루션을 허용하지 않습니다. 이전에는 없었지만 지금은 유효합니다.

6

sed , 67 60 (59 + 1) 바이트

s,^,1/1/1 ,
:;s,(1*/(1*)/(1*).*)1$,\2\3/\1,
t
s,(/1*).*,\1,

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

-E플래그에 대해 +1 (BRE 대신 ERE). 입력과 출력은 모두 단항입니다 : x = 5의 경우 입력 11111 예 : 출력은 두 개의 단항 숫자의 일부입니다 : 위에서 언급 한 11111 입력은 출력 11111/1111 (10 진수 5/4)을 산출합니다.

파도바 시퀀스 의 연속 요소 사이의 분수로 플라스틱 수를 근사합니다 .


1
FWIW 당신은 뒤에 공백이 필요하지 않습니다 b명령을,하지만 당신은 빈 라벨을 (사용하여 여전히 단축 할 수 :b인수없이). tio.run/#%23K05N@f@/…
Jordan

오 훌륭합니다. 그리고 t대신을 사용하여 또 다른 4 바이트를 저장할 수 b있으므로 꽤 좋습니다. 감사합니다 :)
FireFly

5

수학, 27 바이트

Nest[(1+#)^(1/3)&,1,#]~N~#&

중첩 된 큐빅 라디칼 형태 ³√ (1 + ³√ (1 + ³√ (1 + ...))) 의 잘린 근사법을 사용합니다 . 출력은 항상 x-1 소수 자릿수를 갖지만 식은 반복 당 한 자리보다 느리게 수렴하기 때문에 결과는 실제로 정확도가 떨어집니다 ( x 는 계산 된 중첩 라디칼의 수로도 사용됨). 예를 들어 x = 100

_________________________________________________________________________
1.324717957244746025960908854478097340734404056901733364534015050302827850993693624204577670741656151

겹친 부분이 올바른 곳.


에서이 알고리즘을 작성하려고 dc했지만 큐브 루트 연산이없고 숫자로 거듭 제곱 한 숫자도 올라가지 않기 때문에 문제가 발생했습니다. 매스 매 티카는 ... 적절한 내장 명령을 가지고

3
@ ais523 실제로는 CubeRoot있지만 아무도 바이트를 얻지 못했습니다.
Martin Ender

4

옥타브 , 50 바이트

@(n)char(digits(n)*0+vpasolve(sym('r^3-r-1'))(1));

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

n원하는 출력 자릿수로 익명 함수를 정의합니다 .

이 대답 digits은 변수 정밀도 산술의 자릿수에 대한 현재 설정을 반환하는 악용입니다 . 즉, '너무 많은 출력 인수'에 대한 오류없이 익명 함수에서 사용할 수 있습니다.

그 외에는 매우 간단합니다. vpasolve마지막 정밀도 호출에서 설정 한 정밀도로 Variable-Precision Arithmetic Solve의 줄임말입니다 digits. vpa스펙에 따라 금지 된 Octave의 Symbolic 데이터 유형 이므로 char(...)문자열 출력을 얻기 위해 전체 함수를 래핑합니다 . 에 참고 solvevpasolvef==0암시, 그래서 r^3==r+1으로 대체되었습니다r^3-r-1 (==0)


나는 이런 질문에 대답하지 않도록 질문을 갔다.

@ ais523 감사합니다!
Sanchises

4

MATL ( 27 28 바이트)

7BG:"t@)y@Q)+h]tG3+)yG2+)/

내 첫 번째 해결책 (27 바이트)

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

확실히 최적은 아니지만 MATL에 여전히 익숙합니다.

설명:

내가 만드는 파도 반 순서를 다음 마지막 두 숫자의 비율을 찾을 입력 + 3까지.

7B     % Turn 7 into binary to give 1 1 1 
G:"    % For k=1:input do...
t@)    % Existing sequence member k
y@1+)  % Existing sequence member k+1
+h     % Add them together and concatenate to the sequence array
]      % End loop
tG3+)  % Final sequence member
yG2+)  % Second last sequence member
/      % Divide to approximate ρ

적절한 분수 출력 (35 바이트) (28 바이트, @Sanchises) :

그러나 첫 번째 솔루션은 기본 MATL 설정의 부동 소수점 제한 인 임의의 정밀도가 필요하지 않습니다. 그보다,이 정밀도를 확장하는 여러 바이트를 추가하는 것보다, 상기 적절한 분획 경로를 취하고 (N-1)의 마지막 두 개의 정수의 일부를 작성 간단 번째 와 N 번째의 버림 파도 반 시퀀스의 요소.

예 : "114/86"

7BG : "t @) y @ 1 +) + h] tG3 +) V '/'YcyG2 +) VYc

7BG:"t@tQh)sh]tJ)V47hyJq)Vh&

사용자 @ Sanchises 제공. :)

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

반복적이지 않은 평가 :

특히 '정확한'버전의 가장 짧은 코드 는 (23 바이트)입니다.

1-1h69X^12**108+1I/^6/s

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

...하지만 임의의 정밀도를 제공하지는 않습니다. 누구나 규칙을 이행하고 (입력 등을 사용하여) 5 바이트 미만을 추가하도록 조정할 수 있는지 궁금합니다. :피


1
1+이를 Q염두에두고 @)y@1+)+그냥로 대체 할 수 있습니다 @tQh)s. 또한 J배열의 끝을 나타내는 데 사용할 수 있습니다 . 당신이 교체 할 수 있도록 마지막으로, MATL은 일반 배열과 문자 배열을 구분하지 않습니다 Yc에 의해 h(당신의 추가 기능이 필요하지 않습니다 Yc). 이것은 단지 28 바이트를 제공합니다 : 7BG:"t@tQh)sh]tJ)V47hyJq)Vh&( &불필요한 출력을 방지 '/'하고 47로 대체한다는 것을 유의하십시오 )
Sanchises

1
에 대한 명예 7B훨씬 더 순진 밀어 이상하지만lllv
Sanchises

1
@DrQuarius 최신 버전은 항상 이 GitHub 링크에서
Luis Mendo

1
@ DrQuarius 아니요,이 동작은 내가 일반적으로 사용하는 다소 오래된 MATL 사양에 있습니다. 실제로 표 3을 확인해야합니다. J기본적으로 클립 보드 에는 기본적으로 포함되어 1j있을뿐만 아니라 클립 보드 L에는 유용한 인덱싱 함수가 많이 포함되어 있습니다 ( MATL 과 1j동일 end).
Sanchises 2016 년

1
또한 걱정하지 마십시오. 저는 기계 엔지니어입니다. MATL (AB)은 과학적 환경 밖에서는 거의 사용하지 않는다고 생각하므로 MATL (AB) / Octave 골퍼의 대다수는 CS 외부에서 온 것으로 추측합니다.
Sanchises

4

M , 15 14 바이트

²×3’
*3Ḥ‘÷Ç
Ç¡

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

연산

이것은 합리성과 뉴턴의 방법을 사용합니다. 특히, 입력 x의 경우 시작 값 x 의 첫 x 반복 이 적용됩니다.

다항식 p (t) = t³-t-1 의 특정 근을 찾으려고합니다 . Newton의 방법은 시작 값 t 0ρ에 충분히 근접한 – 를 취하고
t n + 1 = t n -p (t n ) / p '(t n )에 의해 시퀀스를 재귀 적으로 정의 함으로써이를 달성합니다 .

사람 P '(t) = 3t² -1 우리 얻을
t N + 1 = t N - (t N ³ - t N - 1) / (3t N ² - 1) = (3t N ³ - t N - t의 N ³ + t n + 1) / (3t n ²-1) = (2t n ³ + 1) / (3t n ²-1) .

초기 근사합니다 x는 점차적으로 악화 X의 증가. 반면에 대한 출력 (X) = (3) 의 출력보다 다소 덜 정밀 X = 2 뉴턴 방법의 수렴이 차적으로하기 때문에, ρ , 이것은 큰 문제 값이어야한다 (X) .

작동 원리

Ç¡    Main link. Argument: x

Ç¡    Call the second helper link x times, which initial argument x.


*3Ḥ‘÷Ç  Second helper link. Argument: t

*3      Compute t³.
  Ḥ     Unhalve; yield 2t³.
   ‘    Increment; yield 2t³+1.
     Ç  Call the first helper link with argument t.
    ÷   Divide the left result by the right one.


²×3’    First helper link. Argument: t

²       Compute t².
 ×3     Compute 3t².
   ’    Decrement; yield 3t²-1.

당신이 사용할 수 너무 나쁘다 ... µ¡...
Outgolfer Erik



1

, 28 바이트

AIθθAθνW‹∕∕Xν³θθ⁺νθA⁺ν¹νI∕νθ

온라인으로 사용해보십시오! 상세 모드로 연결합니다. 또한 나는 분명히 엉망 Divide이고 IntDivide: |
Python 및 JavaScript 답변과 동일한 방법을 사용합니다.


1

NewStack , 14 바이트

¹Fᵢ{E2x³⁺÷3x²⁻

세분화 :

¹                Add arbitrary number 1 to the stack.
 Fᵢ{             Define for loop with a user's input amount of itterations.
    E            Define new edit for element 0 (element 0 being the 1 added. earlier).
     2x³⁺÷3x²⁻   update x to equal (2x^3+1)/(3x^2-1). (x = element 0).

작동 방식 :

공식 (2x 3 +1) / (3x 2 -1)은 적도 x 3 = x + 1에 대한 뉴턴 방법 의 단순화에서 비롯됩니다 . 여기에서 찾을 수 있습니다 . 이 과정을 반복하면 플라스틱 숫자가 무한히 수렴됩니다. 수렴 속도는 반복 당 약 2.6 소수점으로 다소 빠릅니다.

INPUT ITERATION >> VALUE
0 >> 1
1 >> 1.5
2 >> 1.3478260869565217
3 >> 1.325200398950907
4 >> 1.3247181739990537
5 >> 1.3247179572447898
6 >> 1.324717957244746    <- 16 decimal precision in 6 iterations!
...
100 >> 1.324717957244746

파도바 시퀀스 대안, 27 25 17 바이트

¹Fᵢ{[ƨ2+ƨ3]ℲƤƨ/ƨ2

세분화 :

¹                  Append first element of Padovan sequence.
 Fᵢ{       Ⅎ       Define for loop of user's input amount of iterations.
    [ƨ2+ƨ3]        Append sum second and third to last elements.
            Ƥƨ/ƨ2  Print ratio of last two elements.

더 나은 인쇄 전략을 선택하여 -2 바이트

스택을 인덱스하는 더 나은 방법을 선택하여 -8 바이트

작동 방식 :

애즈 파도 반 시퀀스가 계속 마지막 두 요소의 비율은 플라스틱 번호 모이다.

INPUT ITERATION >> VALUE
0 >> 1
1 >> 2
...
10 >> 1.3157894736842106
...
89 >> 1.324717957244746    <- 16 decimal precision in 89 iterations
...
100> > 1.324717957244746

0

클로저, 46 바이트

#(nth(iterate(fn[i](Math/pow(inc i)(/ 3)))1)%)

반복 된 큐브 루트 공식을 사용합니다. 이것은 조금 더 흥미롭지 만 더 길다.

(def f #(apply comp(repeat %(fn[i](Math/pow(inc i)(/ 3))))))

((f 10)1)
1.3247179361449652

"당신은 할 수 없는 언어에서 그 부동 소수점 연산 임의로 정확 가정, 대신 (부동 소수점 숫자를 출력하는 언어 만 가능 될 것입니다 의미의 실제 정확성을 사용해야합니다 경우 부동 소수점 숫자의 정확성 수
Anders Kaseorg

나는 그것을 알아 차리지 못했습니다. BigDecimal로 큐빅 루트를 구현하는 것은 꽤 까다로워 보입니다.
NikoNyrh

0

자바 스크립트, 36 바이트

f=(x,n=x)=>n**3/x/x<n+x?f(x,++n):n/x

최고의 파이썬 답변과 동일하게 작동합니다. 콘솔에서 console.log실행하면 f(x)자동으로 기록 되므로 포함 되지 않았습니다 .

f=(x,n=x)=>n**3/x/x<n+x?f(x,++n):n/x
console.log(f(300))


0

> <> , 38 + 3 = 41 바이트

11\n;
?!\}2,:01{::::}**-+0(?$-{+{1-:}

프로그램 시작시 스택에 입력이있을 것으로 예상되므로 -v플래그의 경우 +3 바이트입니다 .

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

이진 검색을 효과적으로 수행하여 출력 값을 좁 힙니다. 증가 x하면 수행 할 반복 횟수가 증가합니다.

편집 : 1 바이트, 이전 버전을 저장하기 위해 계산을 약간 리팩토링했습니다.

11\n;
?!\}2,:0{::::}**$-1-0)?$-{+{1-:}


0

TI-BASIC, 21 바이트

:Prompt X //Prompt for input, 3 bytes
:While X  //While X, 3 bytes
:³√(1+Y→Y //Calculate cube root of 1+Y and store to Y, 7 bytes
:DS<(X,0  //Decrement X and skip next command (which doesn't do anything), 5 bytes
:End      //End While loop, 2 bytes
:Y        //Display Y, 1 byte

재귀 공식을 사용합니다 .

흥미롭게도 숫자를 하드 코딩하고 반올림하면 동일한 바이트 수를 얻습니다.

TI-BASIC, 21 바이트

:Prompt X    //Prompt for input, 3 bytes
:.5√(3       //Store √(3)/2 to Ans, 5 bytes
:Ansֿ¹cosh(3ֿ¹coshֿ¹(3Ans //Store the plastic number to Ans, 9 bytes
:round(Ans,X //Round the plastic number X decimal digits, 4 bytes

삼각법 공식을 사용합니다 .


난 당신이 여기 TI-BASIC의 수레를 사용할 수 있다고 생각하지 않습니다 :Your answer must work in a hypothetical variant of your language in which integers can be arbitrarily large, and memory (including stack) is unlimited. You may not assume that floating-point arithmetic in your language is arbitrarily accurate, but must instead use its actual accuracy (meaning that outputting a floating-point number is only going to be possible in languages where the accuracy of floating-point numbers can be controlled at runtime).
lirtosiast

0

C # , 317 바이트

using m=System.Math;a=x=>{if(a==0)return "1/1";var d=a(x-1).Split('/');var b=int.Parse(d[0]);var c=int.Parse(d[1]);return string.Format("{0}/{1}",(2*m.Pow(b,3)+m.Pow(c,3)).ToString(new string('#',int.MaxValue.ToString().Length)),(3*m.Pow(b,2)*c-m.Pow(c,3)).ToString(new string('#',int.MaxValue.ToString().Length)));};

결과를 분수로 반환합니다.

설명

다항식 p ^ 3-p-1 = 0의 근을 찾기 위해 x 반복과 함께 Newton의 방법을 사용합니다. 공식은 x_n = 1- (f (x_ (n-1))) / (f '(x_ (n-1)))이며 x_0은 시작점입니다.

다항식 도함수는 3p ^ 2-1이며 x_ (n-1) = b / c라고합시다. 그런 다음 위의 공식을 사용하면 x_n = (2 b ^ 3 + c ^ 3) / (3 b ^ 2 cc ^ 3)이됩니다. 우리가 1부터 시작한다고 가정 해 봅시다. x = 2 일 때 x> 1이고 정수이기 때문에 발생합니다. 식별되고 주석이 달린 코드 :

using System;
string PlasticNumber(int x)
{
    if (x == 2) 
        return "1/1";                 

//If x=2, we return our starting value, but we need to return it as a fraction

    var d = PlasticNumber(x - 1).Split('/');
    var b = System.Convert.ToInt32(d[0]);
    var c = int.Parse(d[1]);

//We parse the previous value of the fraction, and put it into two variables

    return string.Format("{0}/{1}", 
        (2 * Math.Pow(b, 3) + Math.Pow(c, 3))
        .ToString(new string('#', int.MaxValue.ToString().Length)),
        (3 * Math.Pow(b, 2) * c - Math.Pow(c, 3))
        .ToString(new string('#', int.MaxValue.ToString().Length)));

//We return the result as a fraction, but it's important not to return it in
  scientific notation, because that will cause issues in the parsing process 

}


0

공리, 96 바이트

h(n:NNI):Float==(n>1.E5=>-1;n:=n+1;j:=digits(n::PI);r:=solve(x^3-x=1,10.^-n);digits(j);rhs(r.1))

결과

(31) -> [h(i) for i in 0..10]
   (31)
   [1.0, 1.3, 1.33, 1.325, 1.3247, 1.32472, 1.324718, 1.324718, 1.32471796,
    1.324717957, 1.3247179572]
                                                         Type: List Float

h (2)가 1.33이 아닌 1.32 여야하는 방법을 알 수 있으므로 마지막 숫자에 오류가 있습니다.

그러면 110 바이트 중 하나가 있습니다.

g(n:NNI):Float==(n>1.E5=>-1;n:=n+1;j:=digits(n::PI);x:=sqrt(23./108);r:=(.5+x)^(1/3)+(.5-x)^(1/3);digits(j);r)

그것은 m ^ sqrt (q ^ 2- p ^ 3) 및 x = (q + m) ^ (1/3) + (qm) ^ (1/3)

이 경우 r ^ 3-r-1 = 0은 r ^ 3-3 * (1/3) r-2 * (1/2) = 0으로 쓸 수 있으므로 p = 1 / 3 q = 1 / 2 m = 1 / 4-1 / 27 = 23 / 108 x = (0.5 + m) ^ (1/3) + (0.5-m) ^ (1/3)

시작점 r = 1로 뉴턴 반복을 사용하는

f(n:NNI):Float==(n>1.E5=>-1;n:=n+1;j:=digits(n::PI);e:=10^-n;r:=1.;repeat(v:=(r^3-r-1)/(3*r^2-1);abs(v)<e=>break;r:=r-v);digits(j);r)

부동 소수점에 따라 n + 1 자리수의 하나의 obj를 얻기 위해 숫자 값이 함수에서 변경됩니다. 마지막에 numeric () 값이 우선 값으로 다시 지정됩니다.


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