質問: - sintbl[i]; } ``` C言語による最新アルゴリズム辞典:奥村晴彦著:技術評論社より ※ 同書の該当部分に「標本点の数 n は2の整数乗に限る」との記載あり
回答: ほぼ、sayuri さんの回答に書いてある通りですが、 `for (i = 1; i < n8; i++) {...}`内部の式は、 ``` c == cos(x) s == sin(x) dc == cos(x)*(1-cos(Δx))+sin(x)*sin(Δx) ds == sin(x)*(cos(Δx)-1)+cos(x)*sin(Δx) ``` である場合に、計算後は ``` c == cos(x+Δx) s == sin(x+Δx) //`dc`, `ds`は省略します ``` となることが、加法定理などから証明できます。(証明も省略しときます。) (もちろん初期値を`x=0`とした時に上記の前提を満たすことも証明できます。ちなみにご質問のコードだと`Δx = 2π/n`にあたります。) 加法定理をもろに使って、`cos(x)*cos(Δx)-sin(x)*sin(Δx)`, `cos(x)*sin(Δx)+sin(x)*cos(Δx)`などの形の計算をした方がわかりやすいと思うのですが、なぜご質問に記載のような式としているのかまではわかりません。もしかしたら図形的な説明のつく古い公式なのかもしれないと思ったんですが、短時間検索しただけでは由来はわかりませんでした。 なお、最後の`for (i = 0; i < n2 + n4; i++)`の部分は`for (i = 0; i < n2; i++)`の間違いではないかと思います。(`sin(π+x)==-sin(x)`を使っています。)また、上記の説明が成り立つためには`n8 = n/8`が整数でありさえすれば良いので、「標本点の数 n は2の整数乗に限る」条件は厳しすぎで、「nは8の倍数であること」と言う条件さえ成立すれば良いように思われます。(n = 360とすれば、0°〜359°の度数法での三角関数表も作れます。)