2,17,17
3,197,197
4,7699,7699
5,22039,22039
6,102001,102001
7,1005551,1005551
8,10180459,10180459
9,101361899,101361899
10,1000471291,1000471291
11,10012483391,10012483391
12,100000983157,100000983157
13,1000000541933,1000000541933
14,79000000627721,79000000627721
15,105000000696629,105000000696629
16,3675000000716753,3675000000716753
17,55125000000721487,55125000000721487
18,1929375000000746483,929375000000746483
19,55951875000000760183,5951875000000760183
20,2853545625000000820133,53545625000000820133
21,253965560625000001027497,965560625000001027497
22,66285011323125000002913359,5011323125000002913359
23,7225066234220625000003210941,66234220625000003210941
24,65025596107985625000003213893,596107985625000003213893
25,715281557187841875000003216523,1557187841875000003216523
26,6437534014690576875000003219161,34014690576875000003219161
27,1306819404982187105625000004681661,404982187105625000004681661
28,50965956794305297119375000004733119,6794305297119375000004733119
29,764489351914579456790625000004738791,51914579456790625000004738791
30,64981594912739253827203125000005012523,912739253827203125000005012523
Code: Select all
<!DOCTYPE html>
<html lang="zh-TW">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>質數累積和計算器</title>
<style>
body {
font-family: 'Courier New', monospace;
max-width: 800px;
margin: 0 auto;
padding: 20px;
background-color: #f5f5f5;
}
.container {
background: white;
padding: 30px;
border-radius: 10px;
box-shadow: 0 2px 10px rgba(0,0,0,0.1);
}
h1 {
color: #333;
text-align: center;
}
.controls {
margin: 20px 0;
text-align: center;
}
button {
background: #007bff;
color: white;
border: none;
padding: 10px 20px;
border-radius: 5px;
cursor: pointer;
margin: 5px;
font-size: 16px;
}
button:hover {
background: #0056b3;
}
button:disabled {
background: #ccc;
cursor: not-allowed;
}
.results {
margin-top: 20px;
}
.progress {
background: #e9ecef;
border-radius: 5px;
padding: 10px;
margin: 10px 0;
}
.target {
background: #d4edda;
border: 2px solid #c3e6cb;
padding: 15px;
border-radius: 5px;
margin: 15px 0;
}
.sum-display {
font-family: 'Courier New', monospace;
background: #f8f9fa;
padding: 10px;
border-radius: 3px;
word-break: break-all;
font-size: 14px;
}
.error {
color: #dc3545;
background: #f8d7da;
padding: 10px;
border-radius: 5px;
margin: 10px 0;
}
.match {
background: #d1ecf1;
border: 2px solid #bee5eb;
padding: 15px;
border-radius: 5px;
margin: 15px 0;
}
</style>
</head>
<body>
<div class="container">
<h1>質數累積和計算器</h1>
<div class="target">
<h3>目標數字(待驗證):</h3>
<div class="sum-display" id="targetNumber">64981594912739253827203125000005012523</div>
<p>位數: <span id="targetDigits">38</span></p>
</div>
<div class="controls">
<button onclick="startCalculation()">開始計算質數累積和</button>
<button onclick="stopCalculation()" id="stopBtn" disabled>停止</button>
<button onclick="resetCalculation()">重置</button>
</div>
<div class="results">
<div class="progress" id="progress" style="display:none;">
<strong>計算進度:</strong><br>
質數個數: <span id="primeCount">0</span><br>
當前質數: <span id="currentPrime">-</span><br>
累積和: <span id="currentSum" class="sum-display">0</span><br>
位數: <span id="currentDigits">1</span>
</div>
<div id="result" style="display:none;"></div>
</div>
</div>
<script>
const targetNumber = "64981594912739253827203125000005012523";
let isCalculating = false;
let primeCount = 0;
let currentSum = 0n;
let currentPrime = 2;
// 更新目標數字位數顯示
document.getElementById('targetDigits').textContent = targetNumber.length;
function isPrime(n) {
if (n < 2) return false;
if (n === 2) return true;
if (n % 2 === 0) return false;
for (let i = 3; i * i <= n; i += 2) {
if (n % i === 0) return false;
}
return true;
}
function getNextPrime(n) {
n++;
while (!isPrime(n)) {
n++;
}
return n;
}
function startCalculation() {
if (isCalculating) return;
isCalculating = true;
document.querySelector('button').disabled = true;
document.getElementById('stopBtn').disabled = false;
document.getElementById('progress').style.display = 'block';
document.getElementById('result').style.display = 'none';
// 重置或繼續計算
if (primeCount === 0) {
primeCount = 0;
currentSum = 0n;
currentPrime = 2;
}
calculateStep();
}
function calculateStep() {
if (!isCalculating) return;
const startTime = Date.now();
// 每次處理多個質數以提高效率
for (let i = 0; i < 1000 && isCalculating; i++) {
if (primeCount === 0) {
currentPrime = 2;
} else {
currentPrime = getNextPrime(currentPrime);
}
currentSum += BigInt(currentPrime);
primeCount++;
// 檢查是否達到目標
const currentSumStr = currentSum.toString();
// 更新顯示
if (i % 100 === 0 || currentSumStr.length >= 30) {
document.getElementById('primeCount').textContent = primeCount.toLocaleString();
document.getElementById('currentPrime').textContent = currentPrime.toLocaleString();
document.getElementById('currentSum').textContent = currentSumStr;
document.getElementById('currentDigits').textContent = currentSumStr.length;
}
// 檢查是否找到匹配
if (currentSumStr === targetNumber) {
foundMatch();
return;
}
// 如果超過目標位數太多,可能需要停止
if (currentSumStr.length > targetNumber.length + 5) {
noMatch();
return;
}
// 每30位數時報告
if (currentSumStr.length === 30 && i === 0) {
reportMilestone(30, currentSumStr, primeCount);
}
}
// 繼續下一批計算
setTimeout(calculateStep, 10);
}
function foundMatch() {
isCalculating = false;
document.querySelector('button').disabled = false;
document.getElementById('stopBtn').disabled = true;
document.getElementById('result').innerHTML = `
<div class="match">
<h3>✅ 找到匹配!</h3>
<p><strong>第 ${primeCount.toLocaleString()} 個質數的累積和確實等於目標數字</strong></p>
<p>最後一個質數: ${currentPrime.toLocaleString()}</p>
<p>累積和: ${currentSum.toString()}</p>
<p>ChatGPT 的計算是正確的!</p>
</div>
`;
document.getElementById('result').style.display = 'block';
}
function noMatch() {
isCalculating = false;
document.querySelector('button').disabled = false;
document.getElementById('stopBtn').disabled = true;
document.getElementById('result').innerHTML = `
<div class="error">
<h3>❌ 沒有找到匹配</h3>
<p>計算已超過目標數字位數,但沒有找到完全匹配的累積和</p>
<p>這表明 ChatGPT 的計算可能有誤</p>
<p>當前累積和: ${currentSum.toString()}</p>
<p>位數: ${currentSum.toString().length}</p>
</div>
`;
document.getElementById('result').style.display = 'block';
}
function reportMilestone(digits, sum, count) {
console.log(`第一個${digits}位數的質數累積和: ${sum}`);
console.log(`需要前 ${count} 個質數`);
}
function stopCalculation() {
isCalculating = false;
document.querySelector('button').disabled = false;
document.getElementById('stopBtn').disabled = true;
}
function resetCalculation() {
stopCalculation();
primeCount = 0;
currentSum = 0n;
currentPrime = 2;
document.getElementById('progress').style.display = 'none';
document.getElementById('result').style.display = 'none';
}
</script>
</body>
</html>