負でない整数、 オイラー数(OEIS A122045)を出力します。
奇数インデックスのオイラー数はすべて偶数インデックスオイラー数は、下記式(で計算することができるは虚数単位を指します):
ルール
- は、オイラー数が言語の表現可能な整数の範囲内での整数になります。
テストケース
0 -> 1
1 -> 0
2 -> -1
3 -> 0
6 -> -61
10 -> -50521
20 -> 370371188237525
負でない整数、 オイラー数(OEIS A122045)を出力します。
奇数インデックスのオイラー数はすべて偶数インデックスオイラー数は、下記式(で計算することができるは虚数単位を指します):
0 -> 1
1 -> 0
2 -> -1
3 -> 0
6 -> -61
10 -> -50521
20 -> 370371188237525
回答:
EulerE
-咳-
GoatImageQ
過小評価
t.
かt:
、gfとegfです。
Maximaには以下が組み込まれています:
euler
次のソリューションでは、上記の組み込みは不要で、オイラー番号を最初に定義した式を使用しています。
私たちは基本的に、1/cosh(t) = sech(t)
(までn!
)の級数展開のn番目の係数を探しています
f(n):=coeff(taylor(sech(x),x,0,n)*n!,x,n);
{(->*@E {1-sum @E».&{$_*2**(@E-1-$++)*[*](@E-$++^..@E)/[*] 1..$++}}...*)[$_]}
一般的な構造は、繰り返し呼び出され、変数内のシーケンスの以前の値をすべて取得する式によって無限シーケンスが生成されるラムダであり、@E
そのシーケンスはラムダ引数でインデックス付けされます:
{ ( -> *@E { } ... * )[$_] }
シーケンスの各ステップで呼び出される式は次のとおりです。
1 - sum @E».&{ # 1 - ∑
$_ # Eₙ
* 2**(@E - 1 - $++) # 2ⁿ⁻ˡ⁻ᵏ
* [*](@E - $++ ^.. @E) # (n-k-1)·...·(n-1)·n
/ [*] 1..$++ # 1·2·...·k
}
F=(a,b=a)=>a?(b+~a)*F(--a,b-2)+F(a,b)*++b:+!b
すべてに有効 値(必要に応じて)、ただし 一般的に(出力 奇妙な s。)コードを修正して、出力を どこで 以下のように定義されます。具体的には、 は
F=(a,b=a)=>a?-F(--a,b)*++b+F(a,b-=3)*(a-b):+!b
JavaScriptの答えがまだ見つからないことに驚いたので、試してみます。
コードは基本的な数学のみで構成されていますが、コードの背後にある数学には微積分が必要です。再帰公式は、の導関数の展開から導出されます 異なる注文の。
ここでは、便利な表記法を使用します。させて そして 。それから
以来 そして 、我々はそれを推測することができます
させて そして 、上記の関係を次のように書き換えることができます
あれは、 両方に貢献します そして 。その結果、私たちは書くことができます の面では そして :
初期状態で そして どこで 。
コードの関連部分はa?-F(--a,b)*++b+F(a,b-=3)*(a-b):+!b
、上記の繰り返し式を使用して正確に計算しています。内訳は次のとおりです。
-F(--a,b) // -F(n-1, i) [ a = n-1, b = i ]
*++b // *(i+1) [ a = n-1, b = i+1 ]
+F(a,b-=3) // +F(n-1, i-2) [ a = n-1, b = i-2 ]
*(a-b) // *((n-1)-(i-2)) [ a = n-1, b = i-2 ]
// which is equivalent to *(n-i+1)
以来 そして 、 の係数に等しい の拡大 、 。
その枝のために 決して到達できないため、繰り返しは常に0で終了するため、 どこで または 奇妙です。特に後者は、 すべての奇妙な s。でもsよりも厳密に大きい 、再発により最終的には ある時点で発生しますが、そのステップの前に、 、および繰り返し式は、その時点で値が0でなければならないことを示しています(最初の項が乗算されるため 、および2番目の項は、の「三角形」から遠い )。結果として、 どこで 。これで、アルゴリズムの妥当性の証明が完了しました。
コードを変更して、さらに3つの関連シーケンスを計算できます。
正接数(46バイト)
F=(a,b=a)=>a?F(--a,b)*++b+F(a,b-=3)*(a-b):+!~b
Secant Numbers(45バイト)
F=(a,b=a)=>a?F(--a,b)*++b+F(a,b-=3)*(a-b):+!b
オイラージグザグ数(48バイト)
F=(a,b=a)=>a?F(--a,b)*++b+F(a,b-=3)*(a-b):!b+!~b
これは、単に最初の16のオイラー数(すなわちEのハードコードされた一連のサポート0 Eまで15)。それを超えるものは、とにかく32ビットのBefunge値に収まりません。
&:2%v
v@.0_2/:
_1.@v:-1
v:-1_1-.@
_5.@v:-1
v:-1_"="-.@
_"}$#"*+.@v:-1
8**-.@v:-1_"'PO"
"0h;"3_"A+y^"9*+**.@.-*8+*:*
チャレンジで提供された式の完全な実装も行いましたが、サイズはほぼ2倍であり、TIOの最初の16個の値に制限されています(64ビットインタープリターであっても)。
<v0p00+1&
v>1:>10p\00:>20p\>010g20g2*-00g1>-:30pv>\:
_$12 0g2%2*-*10g20g110g20g-240pv^1g03:_^*
>-#1:_!>\#<:#*_$40g:1-40p!#v_*\>0\0
@.$_^#`g00:<|!`g01::+1\+*/\<
+4%1-*/+\2+^>$$10g::2>\#<1#*-#2:#\_$*\1
このアルゴリズムの問題は、系列の中間値が合計よりもはるかに早くオーバーフローすることです。32ビットにそれが最初の10の値を扱うことができるインタプリタ(すなわち、E 0 Eに9)。ただし、bignumを使用するインタープリターは、PyFungeとBefungeeの両方が少なくともE 30まで処理できます。
from sympy import *
t=n+2
print n,re(Add(*map(lambda (k,j):I**(k-2*j-1)*(k-2*j)**(n+1)*binomial(k,j)/(k*2**k),[(c/t+1,c%t) for c in range(0,t**2-t)])))
これは非常に最適ではありませんが、基本的なsympy関数を使用して浮動小数点を回避しようとしています。上記の元の式をまっすぐに設定してくれてありがとう@Mego。Pythonでのゴルフのヒントから@xnorの「2つのループを組み合わせる」ようなものを使用しようとしました。
import*
バイトを保存するために(間にスペースを削除します)。また、何らかの方法で数値を入力として受け取る必要があります(入力が変数にあると想定するスニペットは許可されません)。
{1a{_W%_,,.*0+(+W%\_,,:~.*.+}@*W=}
E(0)〜E(19)を印刷するオンラインデモ。これは匿名ブロック(関数)です。
実装では、赤sしえるの再発を借用し、よりCJamフレンドリーなスタイルに書き換え、一度に行全体を操作します。
{ e# Define a block
1a e# Start with row 0: [1]
{ e# Loop...
_W% e# Take a copy and reverse it
_,,.* e# Multiply each element by its position
0+(+ e# Pop the 0 from the start and add two 0s to the end
W% e# Reverse again, giving [0 0 (i-1)a_0 (i-2)a_1 ... a_{i-2}]
\ e# Go back to the other copy
_,,:~.* e# Multiply each element by -1 ... -i
.+ e# Add the two arrays
} e#
@* e# Bring the input to the top to control the loop count
W= e# Take the last element
}
euler
OEIS A122045の場合; これは57バイトです
g(n:NNI):INT==factorial(n)*coefficient(taylor(sech(x)),n)
テストコードと結果
(102) -> [[i,g(i)] for i in [0,1,2,3,6,10,20]]
(102)
[[0,1],[1,0],[2,- 1],[3,0],[6,- 61],[10,- 50521],[20,370371188237525]]
(103) -> [[i,euler(i)] for i in [0,1,2,3,6,10,20]]
(103)
[[0,1],[1,0],[2,- 1],[3,0],[6,- 61],[10,- 50521],[20,370371188237525]]
E←{0≥w←⍵:1⋄1-+/{(⍵!w)×(2*w-1+⍵)×E⍵}¨¯1+⍳⍵}
「smls」から示された式に従って、テストします。
E 0
1
E 1
0
E 3
0
E 6
¯61
E 10
¯50521
最後のケースは、20.0 float 64ビットと思うので20ではなく20x(大きな合理的20/1)を入力するため、結果として1つの大きな合理的を返します...
E 20x
370371188237525
すぐに0を返すと、より速くなりますが、もう少し長くなります(50文字)。
E←{0≥w←⍵:1⋄0≠2∣w:0⋄1-+/{(⍵!w)×(2*w-1+⍵)×E⍵}¨¯1+⍳⍵}
E 30x
¯441543893249023104553682821
問題の定義を使用すると、より高速になります(そして、もう少し長い75文字になります)。
f←{0≥⍵:1⋄0≠2∣⍵:0⋄0J1×+/{+/⍵{⍺÷⍨(0J2*-⍺)×(⍵!⍺)×(¯1*⍵)×(⍺-2×⍵)*n}¨0..⍵}¨⍳n←1+⍵}
f 0
1
f 1
0
f 3
0
f 6
¯61J0
f 10
¯50521J¯8.890242766E¯9
f 10x
¯50521J0
f 20x
370371188237525J0
f 30x
¯441543893249023104553682821J0
f 40x
14851150718114980017877156781405826684425J0
f 400x
290652112822334583927483864434329346014178100708615375725038705263971249271772421890927613982905400870578615922728
107805634246727371465484012302031163270328101126797841939707163099497536820702479746686714267778811263343861
344990648676537202541289333151841575657340742634189439612727396128265918519683720901279100496205972446809988
880945212776281115581267184426274778988681851866851641727953206090552901049158520028722201942987653512716826
524150450130141785716436856286094614730637618087804268356432570627536028770886829651448516666994497921751407
121752827492669601130599340120509192817404674513170334607613808215971646794552204048850269569900253391449524
735072587185797183507854751762384660697046224773187826603393443429017928197076520780169871299768968112010396
81980247383801787585348828625J0
上記の結果は、実数部のみを持つ1つの複素数です。
-i/2
歩留まり、-i
追加したとき。それにi
合計の外側を掛けると、が得られ1
ます。