2009年3月19日木曜日

二項係数

どこかの影響を受けて書いてみました。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>二項係数</title>
<base href="http://ajax.googleapis.com/ajax/libs/dojo/1.2.3/" />
<link rel="stylesheet" type="text/css" href="dojo/resources/dojo.css" />
<link rel="stylesheet" type="text/css" href="dijit/themes/soria/soria.css" />
<script type="text/javascript" src="dojo/dojo.xd.js" djconfig="parseOnLoad: true"></script>
<script type="text/javascript">
// <![CDATA[
dojo.require("dijit.form.NumberTextBox");
var MAX = 10000000;
function onChange() {
var n = N.attr('value');
var k = K.attr('value');
if (isNaN(n) || isNaN(k) || k > n)
return;
k = Math.min(k, n - k);
if(k == 0)
k = 1;
else {
var numerator = [];
for(var i = 0; i < k; i++)
numerator.push(n - i);

for(var i = 2; i <= k; i++) {
var j = i;
for(var p = 2; j > 1; p++) {
while(j % p == 0) {
j /= p;
for(var l = 0; l < numerator.length; l++) {
if(numerator[l] % p == 0) {
numerator[l] /= p;
break;
}
}
}
}
}
var result = [1];
dojo.forEach(numerator, function(i) {
var rest = 0;
for(var j = 0; j < result.length; j++) {
var k = result[j] * i + rest;
result[j] = k % MAX;
rest = (k - result[j]) / MAX;
}
if(rest > 0)
result.push(rest);
});
k = result.pop().toFixed();
dojo.forEach(result.reverse(), function(i) {
k += (i + MAX).toFixed().substr(1);
});
}
dojo.byId('result').innerHTML = k;
}
// ]]>
</script>
</head>
<body class="soria">
<h1><sub>n</sub>C<sub>k</sub></h1>
n = <input type="text" dojotype="dijit.form.NumberTextBox" jsid="N" value="0"
required="true" constraints="{fractional: false, min: 0}" intermediatechanges="true" onchange="onChange" /><br />
k = <input type="text" dojotype="dijit.form.NumberTextBox" jsid="K" value="0"
required="true" constraints="{fractional: false, min: 0}" intermediatechanges="true" onchange="onChange" /><br />
<span id="result"></span>
</body>
</html>

0 件のコメント: