ただし、式はかなり面倒で実験的な内容といえます。
- 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は素数ではない)。