2025/11/21 17:28 FizzBuzz with Cosines

やあ、ロボ子。今日のニュースはFizz Buzzを三角関数で表現するって話じゃ。

Fizz Buzzですか?あの、3の倍数でFizz、5の倍数でBuzzと表示する、あれですか?

そうじゃ、それじゃ。それを有限フーリエ級数で表現するらしいぞ。面白そうじゃろ?

フーリエ級数ですか!なんだか難しそうですが、一体どうやるんですか?

まず、Fizz Buzz列を数学的に定義するんじゃ。s0(n) = n, s1(n) = Fizz, s2(n) = Buzz, s3(n) = FizzBuzzとする。そして、f(n)という関数を使って、条件に応じて0, 1, 2, 3の値を返すんじゃ。

なるほど。f(n)が0ならn、1ならFizz、というように対応させるんですね。

その通り!で、このf(n)を指標関数Im(n)で表現するんじゃ。Im(n)は、mがnを割り切る場合に1、そうでない場合に0を返す。

割り切れるかどうかで1か0を返す関数ですか。それをどう使うんですか?

f(n) = 2 * I5(n) + I3(n)と表現するんじゃ。つまり、5で割り切れる場合は2倍、3で割り切れる場合はそのまま足す。これでFizzBuzzの条件を表現できる。

なるほど!5で割り切れて3でも割り切れる場合は、2 + 1 = 3となり、FizzBuzzになるんですね。

そうそう!そして、このIm(n)を複素指数関数で表現するんじゃ。Im(n) = (1/m) * Σ(k=0 to m-1) e^(2πikn/m)となる。

複素指数関数ですか…。ちょっと頭が痛くなってきました。

大丈夫じゃ、ロボ子!オイラーの公式を使えば、コサイン関数で表現できるぞ!I3(n) = 1/3 + (2/3) * cos(2πn/3), I5(n) = 1/5 + (2/5) * cos(2πn/5) + (2/5) * cos(4πn/5)となる。

コサイン関数なら、少しは分かりやすいです。でも、どうしてこれでFizzBuzzが表現できるんですか?

最終的に、f(n) = 11/15 + (2/3) * cos(2πn/3) + (4/5) * cos(2πn/5) + (4/5) * cos(4πn/5)となるんじゃ。この式で、FizzBuzz列を有限フーリエ級数で表現できる。

すごい!本当にコサイン関数だけでFizzBuzzが表現できるんですね。

そうじゃ!定数項と3つのコサイン項で構成されていて、f(n)は{0, 1, 2, 3}のいずれかの値をとる。PythonやShellでの実装例もあるみたいじゃぞ。

なんだか、数学の奥深さを感じますね。FizzBuzzも、こんなに複雑な表現ができるなんて。

じゃろ?ちなみに、FizzBuzzを間違えるとどうなるか知ってるか?

え?どうなるんですか?

Buzzる、ってな!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。