note004:素因数分解

2013年1月14日


 ある数を素数の積の形で表すことを「素因数分解」と言う。素数でない自然数は、すべて「合成数」なので、素因数分解ができることになる(ただし、「1」の素因数分解は「1」とする)。



 例えば「12345」を素因数分解する手順を考えてみる。1の位が「5」なので、「2」で割ると余りが出てしまう。そこで「3」で割ってみる。「12345÷3=4115」で割りきることができた。続けて、その商を割る「4115÷3=1371.666…」とすると、割り切れないので、次の素数「5」で割ってみる。「4115÷5=823」となった。

 ここまでで「12345=3*5*823」と表すことができた。ところが「823」を「7」で割っても「11」で割っても余りが出てしまう。いったい、どこまで素数で割り続けなければならないのか。「12345」の平方根を求め、小数点以下を切り捨て、自然数にすると「111」。「111」は合成数だが、111以下の最大の素数まで調べればよい。

 「111」以下の素数では「109」が最大。109×109=11881、次の素数「113」だと、「113×113=12769」と「12345」より大きな数になってしまう。それより大きな素数は調べなくてもよいとゆーことね。

 で、結局「109」まで調べたとしても「823」を割り切れる数は存在しない。なぜなら「823」は素数だからだ。つまり「12345=3*5*823」で素因数分解は完了していたわけ。素因数分解は、互いに素な数の積の形で表せられる。積の交換法則は成り立つが、その一意性が担保されている。つまり、ある自然数を素因数分解すると、たったひと通りに定まり、これ以外の素因数分解の形は存在しない!(キッパリ)

■JavaScript

<script>
function factorize() {
	var X = document.myFORM.myValue.value;
	var sqrX = Math.sqrt(X);
	var ans = "";
	var Answer = "";
	for (i=2; i <= sqrX; i++) {
		if ((X % i)==0) {
			n=0;
			do {
				n++; 			
				X = X / i;
			} while ((X % i)==0);
				if (n==1) {
					ans += "*"+ i;
				} else if (n >1) {
					ans += "*"+ i +"^"+ n ;
				}
			}
		}
	if (X > sqrX) {
		ans += "*"+ X;
	}
	ans = ans.substring(1);
	Answer = "= "+ ans;
	document.getElementById("result").value = Answer;
}
</script>

■HTML

<form name="myFORM">
<input type="text" name="myValue" value="12345">
<input type="button" value=" 素因数分解 " onclick="factorize()"><br />
<input type="text" id="result" value="">
</form>