Excelの数式を使って整数の素因数分解を求める
Excelの数式のみを使用して、100以下の数の素因数分解を求めるにはどうすればいいでしょうか。VBAを使用しない方法を考えたいです。(よって、ユーザー定義の関数も使用しません。)Excelのセル参照とビルトイン関数のみを利用して、基本的に、初期値となるいくつかの数値とセル参照の数式を入力して、[Ctrl]+[D](Fill Down)と[Ctrl]+[R](Fill Right)で延長して、素数と整数の素因数分解の表を作成できないものでしょうか。
とりあえず、思いついた手順を以下に書きます。
以下の手順では、まず、A列に整数、1行目に素数の列、セルには、同じ行のA列の整数の素因数分解における、同じ列の1行目の素数の指数が表示される表を作成します。
Sheet1で
セルA2に
=ROW()-1
と入力
A2:A101を選択
[Ctrl]+[D]でA2の数式を、A101まで数式を延長する。A列は対象の整数を表す。
セルB1に最小の素数である
2
を入力。B列以降、1行目には素数が入ることになる。
セルB2に
=IF(MOD($A2,B$1)>0,0,1+INDEX(B:B,MATCH($A2/B$1,$A:$A,0),1))
と入力。この式は、後の手順で下にも右にも延長する。同じ列の1行目の素数で割り切れない場合は0、割り切れる場合は、その商の整数における同じ列の値に1を足したものである。各列には、同じ行のA列の整数が、同じ列の1行目の素数の最大何乗で割り切れるかが入る。
B2:C101を選択
[Ctrl]+[R]と[Ctrl]+[D]でB2の数式をC101まで延長する。
Sheet2で
Sheet2がなければ増やす。
B1とB2に
1
=Sheet1!B3
を入力。
B列にB3の数式を延長するためにB3からセルを選択する。
B3:B101まで選択して、[Ctrl]+[D]でB3の数式をB101まで延長する。
Sheet2のC列以降は、Sheet1の指数の和を計算して、それまでの素数で割り切れるかどうかを判定するのに使う。それまでの、どの素数でも割り切れなければ0が入る。
C1には
=B1+Sheet1!C1
を入力。
C1:C101まで選択
[Ctrl]+[D]でC1の数式をC101まで延長する。
列ヘッダのCからドラッグでZまで選択。
[Ctrl]+[R]でZ列まで、C列の数式を延長する。
再びSheet1で
C1に
=MATCH(0,Sheet2!B:B,0)-1
を入力。
これは、それまでのどの素数でも、割り切れない最小の数を求めている。すなわちそれが、次に見つかる素数となる。
列ヘッダのCからドラッグでZまで選択。
[Ctrl]+[R]でZ列まで、C列の数式を延長する。
結果、1行目には素数が出現する。他の行には、A列の整数が1行目の素数で何回割ることができるかが入る。再帰的にZ101までの数式で、値が定まる。
ここまでで、整数の素因数分解の各素数の指数が求まる。
本質的にはもうここまでで、素因数分解の表ができたといえる。
以下は素因数分解の見た目でわかりやすい表示にする。たとえば、100を「2^2 5^2」のようにな表し方で一覧を作成する。
Sheet3で
新しいシートSheet3を追加する
B3に
=IF(Sheet1!B3>0,Sheet1!B$1&IF(Sheet1!B3>1,"^"&Sheet1!B3,""),"")
を入力。単にSheet1の指数を素数のべき乗の形で表しただけ。0乗は1だけど、積では何も書かないから、""で表す。また、1乗は指数を書かない。
[Ctrl]+[R]と[Ctrl]+[D]でB3の数式をZ101まで延長する。
Sheet4で
新しいシートSheet4を追加する
B3に
=A3&IF(AND(A3<>"",Sheet3!B3<>"")," ","")&Sheet3!B3
と入力する。Sheet3のB列から、同じ位置のセルまで、値をつなげる。(積で表す。)
B3からドラッグ
B3:Z101を選択。
[Ctrl]+[R]と[Ctrl]+[D]でB3の数式をZ101まで延長する。
Sheet4のZ列に、Sheet1のA列の整数の素因数分解表示ができている。
おわりに
→作成済みのファイルと手順をVBA化したファイルのダウンロード
- PrimeNums.xlsx ・・・作成済みのファイル
- PrimeNumsMacro.xlsm ・・・手順をVBA化したファイル
手順をVBA化したファイルはあくまでも上記手順をマクロで実行するだけで、VBAでの計算は行っていません。
ここでは、100までの素数を表示しましたが、各シートで、右と下に数式を延ばせばもう少し素数と素因数分解を表示できます。
本質的な部分である、Sheet3の追加前までの部分について、シートを2枚も使用していますが、これを1枚で作成する方法はないでしょうか。より簡単にExcel数式だけで素数や素因数分解の表が作れる方法があったら教えてください。もちろんVBAでロジックも書けば少ない労力やデータ量で簡単に同じことをできますが、「Excel数式だけ」しばりでわざわざ何かを作るって少し面白いと思いませんか。