Oka Laboratory

PrimeFactor!

自然数 (natural number) Nの約数 (divisor) になる素数 (prime number) である素因数 (prime factor) を求め、それを積の形で表す素因数分解 (prime factorization) をします。その結果から導かれる数論的関数 (arithmetic function) の値や自然数Nが属する類 (class) を表示します。

素因数分解の計算


素因数分解
種類
素因数分解
無平方分解
二平方和分解
数論的関数の値
関数
素因数の個数
素因数の総数
素因数の和
素因数の総和
根基
約数の個数
約数の総和
約数の総積
Eulerのφ関数
Möbius関数
桁数
数字和
数字根
数字積
逆順数
類の判定
判定
素数
調和数
完全数
乗法的完全数
三角数
矩形数
平方数
立方数
Fibonacci数
Lucas数
Pell数
Jacobsthal数
Mersenne数
Fermat数
Cullen数
中心二項係数
Catalan数
Motzkin数
Montmort数
怠け仕出し屋数
ケーキ数
多冪数
無平方数
Hamming数
humble数
Euler素数
階乗数
素数階乗数
Smith数
harshad数
Zuckerman数
タウ数
算術数
narcissistic数
回文数
計算実行時間
種類 時間[ms]
素因数分解
二平方和分解
数論的関数値
類判定

使用方法

利用上の注意

最大値

このページで扱うことができる素因数分解と二平方和分解の上限は以下の通りです。

種類Nの上限結果
素因数分解90071992547409916361×69431×20394401
二平方和分解9007199254740941330157302+889784292

素因数分解から求められる各数論的関数の最大値は以下の通りです。素因数の個数中のpn#は1番目からn番目までの素数piの総乗である素数階乗 (primorial) を意味しています。

数論的関数 最大値 最大値を取るN
素因数の個数 13 304250263527210 (=p13#)
608500527054420 (=p13p1)
912750790581630 (=p13p2)
1521251317636050 (=p13p3)
2129751844690470 (=p13p4)
3346752898799310 (=p13p5)
3955253425853730 (=p13p6)
5172254479962570 (=p13p7)
5780755007016990 (=p13p8)
6541380665835015 (=p14#/p1)
6997756061125830 (=p13p9)
7149881192889435 (=p13#/p1×p15)
8062631983471065 (=p13#/p1×p16)
8823257642289090 (=p13p10)
8975382774052695 (=p13#/p1×p17)
素因数の総数 52 4503599627370496 (=252)
6755399441055744 (=251×3)
素因数の和
素因数の総和
9007199254740881 9007199254740881
根基 9007199254740991 9007199254740991
約数の個数 σ0(N) 41472 8086598962041600
約数の総和 σ1(N) 5.27299663036608×1016 8608315024108800
Eulerのφ関数 9007199254740880 9007199254740881
数字和 143 8999999999999999
数字積 1647129056757192 8999999999999999
逆順数 9999999999999998 8999999999999999

各々の自然数の類において、取り得る最大の自然数Nは以下の通りです。

取り得るNの最大値 備考
素数 9007199254740881
ピタゴラス素数 9007199254740881 90124842+944773752
ガウス素数 9007199254740847
半素数 9007199254740979 149×60451001709671
楔数 9007199254740991 6361×69431×20394401
調和数 8882379701457408 =540(1124番目)
完全数 137438691328 218×M19(7/51番目)
1倍完全数 1 (1/1番目)
3倍完全数 51001180160 (6/6番目)
4倍完全数 6088728021160320 (14/36番目)
5倍完全数 796928461056000 (7/65番目)
概完全数 4503599627370496 252
乗法的完全数 9007199254740979 8.112963841460645×1031
三角数 9007199187632128 1+⋯+134217727
矩形数 9007199231156490 94906265×94906266
平方数 9007199136250225 949062652
立方数 9007091372906047 2080633
フィボナッチ数 8944394323791464 F78
リュカ数 7639424778862807 L76
ペル数 4217293152016490 P42
ヤコブスタール数 6004799503160661 J54
メルセンヌ数 9007199254740991 M53=253−1
フェルマー数 4294967297 Fe5=232+1
カレン数 6614661952700417 C47=47×247+1
ウッダル数 6614661952700415 W47=47×247−1
中心二項係数 7648690600760440 56C28
カタラン数 3814986502092304 c30
モツキン数 7939655757745265 Mz38
モンモール数 2355301661033953 D18
怠け仕出し屋数 9007199187632129 n=134217727
ケーキ数 9007194154972154 n=378077
多冪数・累乗数 9007199136250225 949062652×13
アキレス数 9007198924021947 182647192×33
無平方数 9007199254740991 μ(N)=−1
カーマイケル数 9007064218955089 7×47×53×4049×5869×21737
L-C数 3614740529402519 11×17×19×23×29×41×59×71×83×107
ハミング数 9000000000000000 215×32×515(7715番目)
ハンブル数 9007135728228540 22×313×5×710(42037番目)
オイラー素数 9007199231156531 E94906266(合成数)
階乗数 6402373705728000 18!
素数階乗数 304250263527210 p13#=41#
ユークリッド数 304250263527211 p13#+1=41#+1
クンマー数 304250263527209 p13#−1=41#−1
スミス数 9007199229917009 数字和=74
ハーシャッド数 9007199254740960 数字和=72
ズッカーマン数 8999821431816192 数字積=967458816
タウ数 9007199254740972 約数の個数=12
算術数 9007199254740991 約数の平均=1126093181162796
ナルシシスト数 4338281769391371 (43/88番目)
回文数 9007199229917009 (190071992番目)
逆除数 2199999999999978 (106番目)

各類に属する素数で取り得る最大値を示します。ユークリッド素数とクンマー素数をまとめて素数階乗素数 (primorial prime) とも言います。

取り得るNの最大値 備考
フィボナッチ素数 2971215073 F47(11/51番目)
リュカ素数 688846502588399 L71(18/64番目)
ペル素数 1746860020068409 P41(7/31番目)
ヤコブスタール素数 2932031007403 J43(11/23番目)
メルセンヌ素数 2147483647 M31=231−1(8/51番目)
フェルマー素数 65537 Fe4=216+1(5/5番目)
カレン素数 3 C1=1×21+1(1/16番目)
ウッダル素数 32212254719 W30=30×230−1(4/34番目)
カタラン素数 5 c3(2/2番目)
モツキン素数 953467954114363 Mz36(4/4番目)
モンモール素数 2 D3(1/1番目)
怠け仕出し屋素数 9007198113890341 n=134217719
オイラー素数 9007199041344001 E94906265
階乗素数 39916801
87178291199
11!+1(5/23番目)
14!−1(6/27番目)
ユークリッド素数 200560490131 p11#+1=31#+1(6/22番目)
クンマー素数 304250263527209 p13#−1=41#−1(5/20番目)
ハーシャッド素数 7 h7(4/4番目)
ズッカーマン素数 11 Z10(5/5番目)
ナルシシスト素数 28116440335967 (5/7番目)
回文素数 999999787999999 (119999978番目の回文数)

アルゴリズム

素因数分解

まずは計算終了値として自然数Nの平方根を求めます。Nを2で割り切れたときは、Nを2で割った商をNに代入し、更に2で割ります。2で割り切れなくなったら、割った回数を次数として素因数リストに保存します。それから計算終了値をそのときのNの平方根√Nに更新し、3以上の自然数についても同じ処理を行います。これを計算終了値に達するまで繰り返していきます。

var prime_factor_0 = function(n) {
/* 素因数分解(除数制限なし) */
	var prime = {};		// 素因数リスト
	var e = 0;			// 指数部
	for (var divisor = 2; divisor * divisor <= n; divisor++) {
		while (n % divisor == 0) {
			n /= divisor;
			e++;
		}
		if (e !== 0) {    
			prime[divisor] = e;	// keyをdivisorとする連想配列にeを保存
			e = 0;
		}
	}
	if (n > 1) prime[n] = 1;	// 残った素数を追加
	return prime;
};

2以外の素数は奇数であることが自明なため、除数を2と3以上の奇数に限定することで計算速度がprime_factor_0() 関数の約2倍になります。

var prime_factor_1 = function(n) {
/* 素因数分解(2の倍数を除外) */
	var prime = {};		// 素因数リスト
	var e = 0;			// 指数部
	for (var i = 0, divisor = 2; divisor * divisor <= n; i++, divisor = i * 2 + 1) {
		while (n % divisor == 0) {
			n /= divisor;
			e++;
		}
		if (e !== 0) {    
			prime[divisor] = e;	// keyをdivisorとする連想配列にeを保存
			e = 0;
		}
	}
	if (n > 1) prime[n] = 1;	// 残った素数を追加
	return prime;
};

2と3以外の素数は6の倍数 (multiple) の前後 (6m±1) に存在します。このため、5以降は交互に2、4ずつ離れた数で処理していくことで、除数から2と3の倍数を除外することができ、prime_factor_1() 関数と比較して計算速度が約1.5倍に向上します。

var prime_factor_2 = function(n) {
/* 素因数分解(2と3の倍数を除外) */
	var prime = {};		// 素因数リスト
	var e = 0;			// 指数部
	for (var divisor = 2, step = 1; divisor * divisor <= n; divisor += step) {
		while (n % divisor == 0) {
			n /= divisor;
			e++;
		}
		if (e !== 0) {    
			prime[divisor] = e;	// keyをdivisorとする連想配列にeを保存
			e = 0;
		}
		if (divisor > 5) {
			step = 6 - step;	// stepは交互に2と4
			continue;
		}
		if (divisor == 3) {
			step = 2;			// divisor=3,5のときはstep=2
		}
	}
	if (n > 1) prime[n] = 1;	// 残った素数を追加
	return prime;
};

6m±1の中には5の倍数も含まれています。このため、除数を7〜31までの素数pi30の倍数を加えた数pi+30jに限定することで、5の倍数も除外することができ、prime_factor_2() 関数に対して計算速度が約1.2倍向上します。このように除数を最初の数個の素数の倍数を除いた数に絞り込む手法をWheel factorizationと言います。

このページでは素数階乗数pi#の判定用として43までの素数リストprime_listを保持していますので、これを流用しました。prime_list[0]はダミー要素、内側のfor文の条件式divisor < nは計算中に除数divisorn以上になった時点で計算を打ち切るためのものです。

var prime_list = [1, 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43];	// 素数リスト
var prime_factor_3 = function(n) {
/* 素因数分解(2と3と5の倍数を除外) */
	var prime = {};		// 素因数リスト
	var e = 0;			// 指数部
	for (var i = 2, j = 0, divisor = 2; divisor * divisor <= n; i = 4, j += 30){
		for (; i < 12 && divisor < n; divisor = j + prime_list[i], i++) {
			while (n % divisor == 0) {
				n /= divisor;
				e++;
			}
			if (e !== 0) {    
				prime[divisor] = e;	// keyをdivisorとする連想配列にeを保存
				e = 0;
			}
		}
	}
	if (n > 1) prime[n] = 1;		// 残った素数を追加
	return prime;
};

関数の戻り値は素因数リストprimeで、大きさが素因数の個数r、キーが各素因数pi、値が素因数の指数部 (exponent) eiである連想配列になっています。これを利用してNの素因数分解の結果は以下の式の形で表すことができます。

N=i=1rpiei

ei=2fi+gi (gi = 0,1) とおくと、Nの無平方分解 lsf2×core は次式で表されます。これは √N=lsfcore と等価です。

N= i=1r(pifi)2×i=1rpigi = lsf2×core

素因数piが以下の2つの条件を同時に満たすときに、2個のゼロではない平方数の和 a2+b2 に分解できます。

  1. pi≡ 3 (mod 4) が含まれているときは、その指数部eiが偶数
  2. pi≡ 1 (mod 4) が含まれているか、pi=2の指数部eiが奇数(もしくはその両方)

この2条件を満たさない平方数、即ち core=1 となる数は 02+lsf2 の形で表すことができますが、下記のコードでは対応していません。

var fermat_sum = function(n, lsf, core) {
/* 二平方和分解 */
	var is_core = core > 1;		// 無平方因子が1ではない
	var m = is_core ? core : n;
	var b = is_core ? int_root(m, 2) : lsf - 1;
	for (var bmin = b * Math.SQRT1_2, a = r = 0; b > bmin; b--) {
		r = m - b * b;
		a = Math.sqrt(r);	// int_root(r, 2)より高速
		if (a % 1 == 0) {
			if (is_core) {
				a *= lsf;
				b *= lsf;
			}
			return a + '<sup>2</sup>+' + b + '<sup>2</sup>';	// HTML文字列
		}
	}
};

引数nに平方数の和の2条件を満たす自然数Nlsfcore に無平方分解で得られた最大平方因子と無平方因子を与えます。bを√n未満の最大の整数からその√1/2 (≡Math.SQRT1_2) 倍まで1ずつ減少させ、aが自然数になった時点で計算を終了します。

数論的関数

素因数分解の結果から直ちに素因数の個数、総数、和、総和と根基(総積)を求めることができます。

個数 ω(N)
r
総数 Ω(N)
i=1rei
和 sopf(N)
i=1rpi
総和 sopfr(N)
i=1r(pi×ei)
根基 rad(N)
i=1rpi

約数d|Nの個数、総和、総積とオイラーのφ関数は次式で求められます。総積が乗法的完全数になるときはその旨を表示します。

個数 σ0(N)
i=1r(ei+1)
総和 σ1(N)
d|Nd = i=1rpi(ei+1)1pi1
総積
d|Nd = Nσ0(N)2
φ関数 φ(N)
Ni=1r(11pi)

メビウス関数μ(N)は前述の定義に則り求めています。

数値の桁数はlengthプロパティでは取得できませんので、数値nを文字列に変換してから長さを取得することで桁数としています。

var digit_number = n.toString().length;	// 桁数

数字和は10で除したときの剰余 (remainder) を順次加算して求め、商 (quotient) が0になるまで続けます。

var digit_sum = function(n) {
/* 数字和 */
	var s = 0;
	while (n) {
		s += n % 10;
		n = Math.floor(n / 10);
	}
	return s;
};

数字根は上記の digit_sum() 関数を利用し、再帰呼出し (recursive call) をすることで求めることができます。引数nが1〜9になった時点で再帰を終了します。

var digital_root = function(n) {
/* 数字根(再帰version) */
	if (n < 10) return n;
	return digital_root(digit_sum(n));
};

9で除したときの剰余を求め、0のとき9に置き換える手順でも数字根を求めることができます。しかし、引数nが0のときの結果は0ではなく9になってしまいます。

var digital_root = function(n) {
/* 数字根(剰余version) */
	var r = n % 9;
	return r ? r : 9;
};

このページでは再帰や三項演算子を使わない方法で求めています。JavaScriptでは剰余演算の符号が被除数 (dividend) と同一であるため、n=0のときは (0−1)%9=−1となります。これより数字根は0と求まります。

var digital_root = (n - 1) % 9 + 1;		// 数字根(単純式version)

数字積は10で除したときの剰余を順に乗じることで求めています。商が0または途中でp=0になったときはwhileループから脱出します。

var digit_product = function(n) {
/* 数字積 */
	var p = 1;
	while (p && n) {
		p *= n % 10;
		n = Math.floor(n / 10);
	}
	return p;
};

逆順数は10で除したときの剰余を加算して求め、商が0になるまで続けます。剰余の加算時にそれまでに得られた値を10倍することで上位桁にシフトさせています。逆順数がNumber.MAX_SAFE_INTEGERより大きくなる時は下位桁に丸め誤差 (round-off error) を生じさせないように文字列に変換しています。

var digit_reverse = function(n) {
/* 逆順数 */
	var r = 0;
	while (n) {
		r *= 10;
		if (r > Number.MAX_SAFE_INTEGER) r = r.toString().slice(0, -1);	// 末尾の1文字を削除した文字列に変換
		r += n % 10;
		n = Math.floor(n / 10);
	}
	return r;
};

自然数の類

属する自然数の類の判定には下記の方法を採用しました。

素数
約数の個数が2個
ピタゴラス素数
素数のうち、4で除したときの剰余が1 ⇒ フェルマーの二平方の定理 (Fermat's 4n+1 Theorem)
ガウス素数
素数のうち、4で除したときの剰余が3
偶素数
N=2
半素数
立方数以外で約数の個数が3〜4個
楔数
約数の個数が8個で、かつ素因数の個数が3個
合成数
素数、半素数、楔数以外
調和数
約数の調和平均が整数
完全数
σ1(N)=2N
不足数
σ1(N)<2N−1
過剰数
σ1(N)>2N
k倍完全数
σ1(NNが3以上の整数
概完全数
σ1(N)=2N−1
乗法的完全数
約数の個数が4個
三角数
2Nが矩形数
矩形数
⌊√N⌋(⌊√N⌋+1)=N
平方数
約数の個数が奇数個
立方数
各素因数piの指数部eiが全て3の倍数
フィボナッチ数
漸化式を用いた動的計画法 (dynamic programing) で求めたFn (n=1, 3≤n≤78) と一致
リュカ数
漸化式を用いた動的計画法で求めたLn (0≤n≤76) と一致
ペル数
漸化式を用いた動的計画法で求めたPn (1≤n≤42) と一致
ヤコブスタール数
漸化式を用いた動的計画法で求めたJn (n=1, 3≤n≤54) と一致
メルセンヌ数
漸化式を用いた動的計画法で求めたMn (1≤n≤53) と一致
フェルマー数
22n+1と一致
カレン数
Nn×2nが+1
ウッダル数
Nn×2nが−1
中心二項係数
漸化式を用いた動的計画法で求めた2nCn (0≤n≤28) と一致
カタラン数
漸化式を用いた動的計画法で求めたcn (n=0, 2≤n≤30) と一致
モツキン数
漸化式を用いた動的計画法で求めたMzn (n=0, 2≤n≤38) と一致
モンモール数
漸化式を用いた動的計画法で求めたDn (n=0, 3≤n≤18) と一致
怠け仕出し屋数
2(N−1)が矩形数
ケーキ数
n=⌊∛6(N−1)⌋のとき、(n3+5n)÷6がN−1と一致
多冪数
各素因数piの指数部eiが2以上
累乗数
多冪数のうち、各素因数piの指数部eiの最大公約数 (greatest common divisor) が2以上
アキレス数
多冪数で累乗数以外
無平方数
μ(N)≠0
カーマイケル数
奇数の無平方数のうち、全ての素因数piN−1がpi−1で割り切れる ⇒ コルセルトの判定法 (Korselt's criterion)
リュカ・カーマイケル数
奇数の無平方数のうち、全ての素因数piN+1がpi+1で割り切れる
ハミング数
素因数piが2、3、5のみ
ハンブル数
素因数piが2、3、5、7のみ
オイラー素数
N−41が矩形数
階乗数
1から順次乗じた値と一致
素数階乗数
2から素数を順次乗じた値と一致
ユークリッド数
素数階乗数より1大きい
クンマー数
素数階乗数より1小さい
スミス数
合成数で数字和が素因数の数字和の合計と一致
ハーシャッド数
Nが数字和で割り切れる
ズッカーマン数
Nが数字積で割り切れる
タウ数
Nが約数の個数 σ0(N) で割り切れる
算術数
約数の総和 σ1(N) が約数の個数 σ0(N) で割り切れる
ナルシシスト数
Nと各位のn乗和(nNの桁数)が一致
回文数
Nが逆順数と一致
逆除数
Nを4倍ないしは9倍した数が逆順数に一致

【参考】オンライン整数列大辞典 (OEIS)

オンライン整数列大辞典 (OEIS) に掲載されている整数列 (integer sequence) の一覧です。

素因数分解
種類ID 種類ID
最小素因数A020639 最大素因数A006530
最大平方因子A000188 無平方核A007913
二平方和A000404
数論的関数
種類ID 種類ID
素因数の個数A001221 素因数の総数A001222
素因数の和A008472 素因数の総和A001414
根基A007947 約数の個数A000005
約数の総和A000203 約数の総積A007955
Eulerのφ関数A000010 Mobius関数A008683
数字和A007953 数字根A010888
数字積A007954 桁数A055642
自然数の類
類名ID 類名ID
素数A000040 奇素数A065091
ピタゴラス素数A002144 ガウス素数A002145
合成数A002808 半素数A001358
楔数A007304 調和数A001599
完全数A000396 3倍完全数A005820
4倍完全数A027687 5倍完全数A046060
概完全数A000079 乗法的完全数A007422
三角数A000217 矩形数A002378
平方数A000290 立方数A000578
過剰数A005101 不足数A005100
フィボナッチ数A000045 リュカ数A000032
ペル数A000129 ヤコブスタール数A001045
メルセンヌ数A000225 フェルマー数A000215
カレン数A002064 ウッダル数A003261
中心二項係数A000984 カタラン数A000108
モツキン数A001006 モンモール数A000166
怠け仕出し屋数A000124 ケーキ数A000125
多冪数A001694 累乗数A001597
アキレス数A052486 無平方数A005117
カーマイケル数A002997 L-C数A006972
ハミング数A051037 ハンブル数A002473
階乗数A000142 素数階乗数A002110
ユークリッド数A006862 クンマー数A057588
スミス数A006753 ハーシャッド数A005349
ズッカーマン数A007602 タウ数A033950
算術数A003601 ナルシシスト数A005188
回文数A002113 逆除数A008919
素数列
素数名 素数列のID n値のID
フィボナッチ素数 A005478 A001605
リュカ素数 A005479 A001606
ペル素数 A086383 A096650
ヤコブスタール素数 A049883 A107036
メルセンヌ素数 A000668 A000043
カレン素数 A050920 A005849
ウッダル素数 A050918 A002234
フェルマー素数 A019434 A159611
モツキン素数 A092832 A092831
怠け仕出し屋素数 A055469 A067186
オイラー素数 A005846 A056561
階乗素数 (n!−1) A055490 A002982
階乗素数 (n!+1) A088332 A002981
ユークリッド素数 A018239 A005234
クンマー素数 A057705 A006794
ナルシシスト素数 A145380 -
回文素数 A002385 -

OEIS以外に各種の整数列を掲載しているサイトです。

参考文献


正当なCSSです!