このコードから三角関数表がどうして作られるのかわかりません


このコードから三角関数表がどうして作られるのかわかりません。  
実行すると確かに三角関数表なのですが、奇っ怪な方法の理由はわかります。  
sinを一度しか呼ばないという制限のためです。  
けれど、その後どうしてこんな方法でと思ったので質問します。

[code]

    static void make_sintbl(int n, float sintbl[])
    {
        int i, n2, n4, n8;
        double c, s, dc, ds, t;
        n2 = n / 2;  n4 = n / 4;  n8 = n / 8;
        t = sin(PI / n);
        dc = 2 * t * t;  ds = sqrt(dc * (2 - dc));
        t = 2 * dc;  c = sintbl[n4] = 1;  s = sintbl[0] = 0;
        for (i = 1; i < n8; i++) {
            c -= dc;  dc += t * c;
            s += ds;  ds -= t * s;
            sintbl[i] = (float)s;
            sintbl[n4 - i] = (float)c;
        }
        if (n8 != 0) sintbl[n8] = (float)sqrt(0.5);
        for (i = 0; i < n4; i++)
            sintbl[n2 - i] = sintbl[i];
        for (i = 0; i < n2 + n4; i++)
            sintbl[i + n2] = - sintbl[i];
    }
    
[/code]

C言語による最新アルゴリズム辞典:奥村晴彦著:技術評論社より  
※ 同書の該当部分に「標本点の数 n は2の整数乗に限る」との記載あり




[ピタゴラスの定理](https://ja.wikipedia.org/wiki/%E4%B8%89%E8%A7%92%E9%96%A2%E6%95%B0%E3%81%AE%E5%85%AC%E5%BC%8F%E3%81%AE%E4%B8%80%E8%A6%A7#.E3.83.94.E3.82.BF.E3.82.B4.E3.83.A9.E3.82.B9.E3.81.AE.E5.AE.9A.E7.90.86)や[倍角公式](https://ja.wikipedia.org/wiki/%E4%B8%89%E8%A7%92%E9%96%A2%E6%95%B0%E3%81%AE%E5%85%AC%E5%BC%8F%E3%81%AE%E4%B8%80%E8%A6%A7#.E5.80.8D.E8.A7.92.E3.83.BB.E4.B8.89.E5.80.8D.E8.A7.92.E3.83.BB.E5.8D.8A.E8.A7.92.E3.81.AE.E5.85.AC.E5.BC.8F)などを使っているのでは？

例えば`sin2Θ`は`sinΘ`を使って  
[![sin2Θ = 2 sinΘ cosΘ = 2 sinΘ * sqrt\(1 -
\(sinΘ\)^2\)](https://i.stack.imgur.com/b8SjU.png)](https://i.stack.imgur.com/b8SjU.png)  
とできるっぽいです。




[ピタゴラスの定理](https://ja.wikipedia.org/wiki/%E4%B8%89%E8%A7%92%E9%96%A2%E6%95%B0%E3%81%AE%E5%85%AC%E5%BC%8F%E3%81%AE%E4%B8%80%E8%A6%A7#.E3.83.94.E3.82.BF.E3.82.B4.E3.83.A9.E3.82.B9.E3.81.AE.E5.AE.9A.E7.90.86)や[倍角公式](https://ja.wikipedia.org/wiki/%E4%B8%89%E8%A7%92%E9%96%A2%E6%95%B0%E3%81%AE%E5%85%AC%E5%BC%8F%E3%81%AE%E4%B8%80%E8%A6%A7#.E5.80.8D.E8.A7.92.E3.83.BB.E4.B8.89.E5.80.8D.E8.A7.92.E3.83.BB.E5.8D.8A.E8.A7.92.E3.81.AE.E5.85.AC.E5.BC.8F)などを使っているのでは？

例えば`sin2Θ`は`sinΘ`を使って  
[![sin2Θ = 2 sinΘ cosΘ = 2 sinΘ * sqrt\(1 -
\(sinΘ\)^2\)](https://i.stack.imgur.com/b8SjU.png)](https://i.stack.imgur.com/b8SjU.png)  
とできるっぽいです。

