今日は が主役です。 は定義から
ですが、ここから を除いた
を考えてみましょう。 のように置き換えると
とできて、これは そのものです。したがって、表題の が成り立ちます。
これだけでも十分面白いのですが、実は という関係式には、こんな面白い特徴があるというのです。
This is the only known solution to n! = a!b! apart from the general pattern, (n!)! = n!(n! - 1)! pic.twitter.com/SPenjs4kQU
— Fermat's Library (@fermatslibrary) 2019年4月20日
上記のツイートは、@apu_yokai さんという方の以下のツイートによって知りました。
n! = a!b! と表すことができる組み合わせのうち、自明な組み合わせ (n!)! = n!(n! - 1)! でないものとして現在知られているのは唯一この組み合わせ
— apu (@apu_yokai) 2019年4月20日
10!=6!7!
のみ。他にもあるかどうかは未解決問題とな🤔 https://t.co/TCAjYEX527
つまり、こういうことです。
というのです。とても面白い話だと思いましたので、私のブログでもぜひ紹介したいと思いました。
問題設定の理解
ここでいう「非自明」というのは、たとえば なる式は除くという意味です。また
という式も一般に成り立ちますが、こういうパターンも除くことにします。
「」はともかく「 なんて知らないよ」という方も多いかと思います。実際、私も今回初めて知りましたが、次のように示すことができます。
を書き下すと
となりますが、 を除いた の部分は そのものです。したがって式 が成り立ちます。
一見非自明にみえるが、定義にかえって考えてみればすぐわかる、というタイプの式だったのですね。*1
もっとスマートに示すこともできます。
階乗の定義より
という式が成り立ちます。この式の に を代入すると式 が得られます。
式 の具体例としては
があります。 を代入した式です。このようなタイプの関係式は除いて考えるということですね。
問題設定を理解したところで、改めて元の問題を見てみましょう。
の証明を思い返すと、階乗数が他の階乗数の積で表せるような状況は他にもあっても良さそうなのに思えるのですが、これだけしか見つかっていないということなのでしょうか。
という関係式がいかに特別かを表していますね。
実際に調べてみよう
せっかくなので、プログラムを使って調べてみようと思います。
とはいえ、階乗を素朴に計算するとすぐに値が爆発してしまい、計算ができなくなってしまいますので少し工夫をします。
をそのまま計算するのではなく、 をそれぞれ素因数分解して、その指数を保存して足し合わせます。こうすることで、たかだか指数の大きさ程度の数を扱えば十分になるので、変数がオーバーフローすることはありません。
以上をRubyで書いたプログラムが以下です。
# factorial.rb require "prime" def to_hash(number) division = Prime.prime_division(number) result = Hash.new division.each do |tuple| prime = tuple[0] exp = tuple[1] if prime > 1 result[prime] = exp end end return result end def product(hash1, hash2) hash2.each_key do |key| if hash1.has_key?(key) hash1[key] += hash2[key] else hash1[key] = hash2[key] end end end # 1 から 200 までのハッシュを先に作っておく hash_list = [] (1..200).each do |n| hash_list << to_hash(n) end (1..200).each do |n| result = [] [*(1..(n-1))].product([*(1..(n-1))]).each do |vec| a = vec[0] b = vec[1] left_hand_side = {} right_hand_side = {} # n! を計算 (2..n).each do |val| product(left_hand_side, hash_list[val - 1]) end # a! b! を計算 (2..a).each do |val| product(right_hand_side, hash_list[val - 1]) end (2..b).each do |val| product(right_hand_side, hash_list[val - 1]) end # n! == a! b! のとき表示 if left_hand_side == right_hand_side result << [n, a, b] end end result.each do |res| puts "#{res[0]}! = #{res[1]}!#{res[2]}!" end end
実際に計算してみると以下が得られます。
$ ruby factorial.rb 6! = 3!5! 6! = 5!3! 10! = 6!7! 10! = 7!6! 24! = 4!23! 24! = 23!4! 120! = 5!119! 120! = 119!5!
上記のプログラムでは、あらかじめ や のケースは出力しないようにしてあります。
のケースは、それぞれ のケースに該当します。これらを除くと、 のケースしかありません。たしかにこれしかありませんね。
というわけで、少なくとも までの間には、 を除く 型の非自明な関係式は得られないことがわかりました。私のプログラムでは計算時間の限界によって 200 ぐらいまでしか計算できませんでしたが、きっともっと先まで計算されているのでしょう。
まだ証明されていないようなので、どちらに転ぶのかわかりませんが、個人的にはこの反例があったら面白いなと思っています。反例があったとしたらどんな形の式になっているでしょうか。
関係する話題
Prime Curios! というウェブサイトで "10" を調べてみると
10! = 3! 5! 7! Note the first three consecutive odd primes. [Capelle]
(10! は最初の連続する3奇素数それぞれの階乗の積で表せる)
とあります。実はこれも の派生系です。
の定義は ですが、真ん中で分けると
がそれぞれ成り立つからです。
前半は定義通りですが、後半が面白いですね。後半の式が成り立つのは すなわち が成り立つからですが、まさに先ほど証明した に を代入したケースになっています。
関連する話をもう一つ。
こんな数学クイズをご存知でしょうか。
1から10までの数から1つの数を取り除いて2組に分けます。それぞれ掛け合わせると、なんと同じ数になりました。さて、最初に取り除いた数はどれでしょう?
一昔前、平成教育委員会という番組のスペシャルの回で「この問題を解かないと給食が食べれない」というような問題として出題された記憶があります。もしかしたら記憶違いかもしれませんが。
上の問題はこんな風に解くことができます。
の素因数に は一つしかありません。そのため、 を取り除かないと、残りを2組に分けたときに積がイコールになりえません。したがって が取り除かれた数になります。
素因数分解の一意性を使った鮮やかな解法ですね。
数の組を具体的に構成してみてもいいでしょう。7より小さい数と大きい数をそれぞれ掛け合わせると
となり、たしかにイコールとなります。よって、取り除かれる数は となります。
ところで、この等式は言い換えると
ということです。
つまり、この整数問題の背景には
という関係式があったわけですね。そう考えると面白いですね。
それでは、今日はこの辺で。
おまけ:10!といえば
せっかくなので、 に関する豆知識を一つ。以前どなたかのツイートで教えていただいて驚いた話です。(どなたのツイートだったか覚えていなくてすみません)
1分間は60秒。
1時間は60分なので、3600秒。
1日は24時間なので、86400秒。
1週間は7日なので、604800秒。
さて、604800を因数分解すると
とできます。
したがって、 秒はちょうど 週間 となります。
うまいことできていますね!
*1:といいつつ、最初はどうやって示すのかわからず、Google検索に「(n!)!=n!(n!-1)!」と入れてひたすら調べていました。自分で考える癖をつけなければいけないですね。。。