いきなり答える備忘録

Google Workspace・Microsoft 365・LibreOfficeなどに関するメモ

(Excel)素因数分解をする

 Excelでの、関数を使った素因数分解の例です。1セル内の式で完結させている内容となっています。
 ただし、式はかなり面倒で実験的な内容といえます。

  • REDUCE/LAMBDA関数等を使って素因数分解を行うことができます。

手順

 B3セルに対象となる数値が入力されています。
 これに対しD3セルに式を入力して素因数分解を行っています。素因数は1つずつ各セルに表示され、昇順で1行に並びます。

 D3セル

=LET(x,
REDUCE(HSTACK(1,B3),SEQUENCE(LOG(B3,2)),LAMBDA(a,b,
LET(c,CHOOSECOLS(a,-1),d,SEQUENCE(SQRT(B3),,2),e,MIN(FILTER(d,MOD(c,d)=0,c)),
HSTACK(TAKE(a,,b),e,c/e)))),
FILTER(x,x>1)
)

 基本的に試し割り法をやっていますが、細かいところはキリがないので要点のみ記したいと思います。
 まず2行目の「HSTACK(1,B3)」はこの例では{1,990}となります。これをLAMBDA関数におけるaの初期配列として定義しています。
 そして4行目のHSTACK/TAKE関数により「aの右端を配列から削除し、その削除された値(c)の素因数のうち最も小さいもの(e)を配列に加え、さらにc/eを配列に加える」という操作を繰り返しています。これによりaは次のように変化していきます
 {1,2,495} (b=1)
 {1,2,3,165} (b=2)
 {1,2,3,3,55} (b=3)
  ・
  ・
 繰り返し回数(b)は「SEQUENCE(LOG(B3,2))」としています(素因数の数≦LOG(B3,2))。
 最後に外側のLET関数とFILTER関数を使って配列中の「1」を削除して出力しています。

 2からSQRT(B3)までの試し割りをすべて行ったうえで小さいものを比較し、さらにbの最後の値まで打ち切ることなく実行するため、計算にはかなり無駄が多いです。
 この「B3」(3行目の「SEQUENCE(SQRT(B3),,2)」のところ)も本来「c」になるべきなのですが、そうすると配列が得られない(「2」しか返ってこない)ため苦肉の策です。これで計算量がさらに増えています。


 次の画像ではB4セル以下にもいくつかの数値を入力し、上記の式を下方にコピーしています。

 上記のように無駄な計算が多いのが難点ですが、100万ぐらいの値なら一瞬で返ります。
 なお、1に対してはエラーを返します(1は素数ではない)。