Dottie番号の概算


13

Dottie番号は余弦関数の固定点である、または方程式の解(X)= X COS1

あなたの仕事は、この定数に近いコードを作成することです。コードは、整数を入力として受け取り、実数を出力する関数を表す必要があります。入力が増加するときの関数の制限は、ドットの数でなければなりません。

数値の分数、小数、または代数表現として出力できます。出力は任意に正確である必要があり、floatとdoubleはこの課題には不十分です。ご使用の言語が任意の精度の数値に対応していない場合、それらを実装するか、新しい言語を選択する必要があります。

これは質問なので、回答はバイト単位で記録され、バイト数は少ない方が良いでしょう。

チップ

定数を計算する1つの方法は、任意の数を取り、それに余弦を繰り返し適用することです。アプリケーションの数は無限に向かう傾向があるため、結果はコサインの固定点に向かう傾向があります。

これはかなり正確な数値の近似値です。

0.739085133215161

1:ここでは、ラジアン単位のコサインを取ります


したがって、Pythonを使用している場合、独自の型またはimportを実装する必要がありDecimalますか?
氏Xcoder

提出物はどれくらい正確でなければなりませんか?
ミスターXcoder

ゼリーのチュートリアルに進みÆẠȷ¡、それが無効であることに気づきます。Brachylogを試行します。ああ、ブラキログはフロートすらしません。
エリックアウトゴルファー

@ Mr.Xcoderこれらは漸近的に正確でなければなりません。
ポストロックガーフハンター

1
Haskell、APL、およびいくつかのLispフレーバーでこれを見たいです。
マークC

回答:


6

MATL34 30 19バイト

Sanchisesのおかげで11バイトオフ!

48i:"'cos('wh41hGY$

出力の最後の10進数はオフになる場合があります。ただし、左から始まる正しい数字の数は入力とともに増加し、結果は実際の定数に収束します。

オンラインでお試しください!

説明

入力nでx = 1 から始まる場合、これは関数を適用します

              X ↦COS(X

N可変精度演算 のn倍。

48         % Push 48, which is ASCII for '1': initial value for x as a string
i:"        % Do n times, where n is the input
  'cos('   %   Push this string
  w        %   Swap. Moves current string x onto the top of the stack
  h        %   Concatenate
  41       %   Push 41, which is ASCII for ')'
  h        %   Concatenate. This gives the string 'cos(x)', where x is the
           %   current number
  GY$      %   Evaluate with variable-prevision arithmetic using n digits
           %   The result is a string, which represents the new x
           % End (implicit). Display (implicit). The stack contains the last x

なぜn桁の精度でn回適用しないのですか?これは非常に複雑に思えます。
-Sanchises

これが信じられない。APLで見たいです。
マークC



3

GNU bc -l、30

スコアにはに対する-lフラグ+1が含まれbcます。

for(a=1;a/A-b/A;b=c(a))a=b
a

最後の改行は重要で必要です。

オンラインでお試しください

-l 2つのことを行います。

  • c()cos(x)を含む「数学」ライブラリを有効にします
  • 精度(スケール)を小数点以下20桁に設定します(bc任意の精度計算があります)

精度の要件についてはあまり明確ではありません。現状では、このプログラムは小数点以下20桁まで計算します。異なる精度が必要な場合scale=n;は、プログラムの先頭に挿入する必要がありますn。ここで、小数点以下の桁数です。これをスコアに追加する必要があるかどうかはわかりません。

また、一部の小数点以下の桁数(たとえば、21ではなく20)では、計算は最後の桁で解の両側を振動させることに注意してください。したがって、現在の反復と前の反復の比較では、両側を10(A)で除算して最後の桁を消去します。


3

Mathematica、22バイト

Nest[Cos@#&,0,9#]~N~#&

入力

[100]

出力

0.73908513321516064165531208767387340401341175890075746496568063577328 \ 46548835475945993761069317665318


2

R(+ Rmpfr)、55バイト

function(n,b=Rmpfr::mpfr(1,n)){for(i in 1:n)b=cos(b);b}

DennisはRmpfrをTIOに追加したので、これは機能します。テストケースを追加しました。

説明:

私はから書いたコード受け取り、この課題を評価するためcos nに開始時間を1、しかし、最初の私は値がオブジェクト作成することで、中にいたいの精度を指定しbたクラスのmpfr値を持つ1と精度をnn>=2私たちは一緒に行くように、我々はより高い精度を得るために、。

オンラインでお試しください!


3
再試行。:)将来、TIOに何か足りないものがあれば、お気軽にtalk.tryitonline.netにメッセージをドロップしてください。
デニス

@デニスありがとうございます!今後もそのことを心に留めておくつもりです!
ジュゼッペ





0

Perl 5、41バイト

use bignum;sub f{$_[0]?cos(f($_[0]-1)):0}

Bignumは、任意の精度に必要です。余弦を0 N回再帰的に適用する関数fを定義します。

TIOにはbignumがないようですので、リンクはありません:(


0

Mathematica 44バイト

FindRoot[Cos@x-x,{x,0},WorkingPrecision->#]&

FindRoot デフォルトでニュートン法を使用します。


0

Python 2、86バイト

import math as m,decimal as d
def f(x,n):return f(d.Decimal(m.cos(x)),n-1)if n else x

提供されるヒントを使用した新しいバージョン。

Python 2、105バイト

import math as m,decimal as d
def f(x,n):return d.Decimal(f(x+(m.cos(x)-x)/(m.sin(x)+1),n-1))if n else x

ニュートンのメソッドと再帰関数を使用し て値を計算します。xは初期値でnあり、再帰制限です。


Pythonの組み込みfloat型は精度が不明確なので、関数は実際には漸近的ではありません。
ポストロックガーフハンター

知っていただきありがとうございます。修正されたと思う、もう短
すぎ

質問で提供されるヒントは、おそらくニュートンの方法よりも短いでしょう。
ポストロックガーフハンター

ありがとう
SydB

0

公理、174バイト

f(n:PI):Complex Float==(n>10^4=>%i;m:=digits(n+10);e:=10^(-n-7);a:=0;repeat(b:=a+(cos(a)-a)/(sin(a)+1.);if a~=0 and a-b<e then break;a:=b);a:=floor(b*10^n)/10.^n;digits(m);a)

ungolfedとコメント

-- Input: n:PI numero di cifre
-- Output la soluzione x a cos(x)=x con n cifre significative dopo la virgola
-- Usa il metodo di Newton a_0:=a  a_(n+1)=a_n-f(a_n)/f'(a_n)
fo(n:PI):Complex Float==
  n>10^4=>%i
  m:=digits(n+10)
  e:=10^(-n-7)
  a:=0     -- Punto iniziale
  repeat
     b:=a+(cos(a)-a)/(sin(a)+1.)
     if a~=0 and a-b<e then break
     a:=b
  a:=floor(b*10^n)/10.^n
  digits(m)
  a

結果:

(3) -> for i in 1..10 repeat output[i,f(i)]
   [1.0,0.7]
   [2.0,0.73]
   [3.0,0.739]
   [4.0,0.739]
   [5.0,0.73908]
   [6.0,0.739085]
   [7.0,0.7390851]
   [8.0,0.73908513]
   [9.0,0.739085133]
   [10.0,0.7390851332]
                                                               Type: Void
           Time: 0.12 (IN) + 0.10 (EV) + 0.12 (OT) + 0.02 (GC) = 0.35 sec
(4) -> f 300
   (4)
  0.7390851332 1516064165 5312087673 8734040134 1175890075 7464965680 635773284
  6 5488354759 4599376106 9317665318 4980124664 3987163027 7149036913 084203157
  8 0440574620 7786885249 0389153928 9438845095 2348013356 3127677223 158095635
  3 7765724512 0437341993 6433512538 4097800343 4064670047 9402143478 080271801
  8 8377113613 8204206631
                                                      Type: Complex Float
                                   Time: 0.03 (IN) + 0.07 (OT) = 0.10 sec

「繰り返しcos(x)メソッド」よりも高速であるため、Newtonメソッドを使用します。

 800   92x
1000  153x
2000  379x

ここで、最初の列には桁数があり、2番目の列には、繰り返しcos(x)メソッドを使用するよりも高速のニュートン法があります。おはようございます

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.