Repository navigation
Expand file tree
/
Copy pathscript.js
More file actions
99 lines (83 loc) · 3.15 KB
/
Copy pathscript.js
File metadata and controls
99 lines (83 loc) · 3.15 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
// エラトステネスの篩で 10^6 までの素数リストを作成
const sieveLimit = 1000000; // 100万までの素数リストを作成
const smallPrimes = [];
const isPrimeArray = Array(sieveLimit + 1).fill(true);
function initializeSieve() {
isPrimeArray[0] = isPrimeArray[1] = false;
for (let i = 2; i <= sieveLimit; i++) {
if (isPrimeArray[i]) {
smallPrimes.push(i);
for (let j = i * i; j <= sieveLimit; j += i) {
isPrimeArray[j] = false;
}
}
}
}
// 試し割り法による素数判定
function isPrime(n) {
if (n <= sieveLimit) {
return isPrimeArray[n];
}
// nがsieveLimitより大きい場合、smallPrimesで試し割り
for (let p of smallPrimes) {
if (p * p > n) break; // √N までの素数で割り切れなければ素数
if (n % p === 0) return false;
}
return true;
}
// DFSを用いた順列生成
function dfs(nums, path, k, result) {
if (path.length === k) {
// 数字を整数に変換
let num = parseInt(path.join(''), 10);
let remainingNums = nums.filter(n => !path.includes(n));
result.push({ num, remainingNums });
return;
}
for (let i = 0; i < nums.length; ++i) {
let nextNums = nums.slice(0, i).concat(nums.slice(i + 1));
dfs(nextNums, [...path, nums[i]], k, result);
}
}
// 残りの数字で作れる素数を判定
function canMakePrime(remainingNums) {
let remainingPermutations = findPermutations(remainingNums, remainingNums.length);
return remainingPermutations.some(isPrime);
}
// 順列を取得する関数
function findPermutations(nums, k) {
let result = [];
dfs(nums, [], k, result);
return result.map(entry => entry.num);
}
// 順列を生成し、素数のみ表示
function generatePermutations() {
let numsInput = document.getElementById("numbers").value;
let nums = numsInput.split(",").map(num => parseInt(num.trim())).filter(num => !isNaN(num));
let choose = parseInt(document.getElementById("choose").value);
let checkRemainder = document.getElementById("checkRemainder").checked; // チェックボックスの状態を取得
if (isNaN(choose) || choose <= 0 || choose > nums.length) {
alert("有効な選択数を入力してください。");
return;
}
let permutations = [];
dfs(nums, [], choose, permutations);
let resultsDiv = document.getElementById("results");
resultsDiv.innerHTML = "";
let fragment = document.createDocumentFragment();
permutations.forEach(({ num, remainingNums }) => {
if (isPrime(num)) {
let resultElement = document.createElement("div");
resultElement.classList.add("result-item");
// 余りの数の素数判定をするかどうかチェックボックスで決定
if (checkRemainder && canMakePrime(remainingNums)) {
resultElement.classList.add("result-item-remain");
}
resultElement.textContent = num;
fragment.appendChild(resultElement);
}
});
resultsDiv.appendChild(fragment);
}
// 初期化
initializeSieve();