यह सवाल क्या एक "बड़ी संख्या" है और स्वीकार करता है की परिभाषा में कम पक्ष पर एक छोटे से कंजूस है:
नीचे एरेटोस्थेनेज की चलनी पारंपरिक प्रोग्रामिंग प्रथाओं पीछा कर रहा है कि यह केवल दस लाख से शुरू होता है, जिसके लिए current answer काम करता है; हालांकि, यह प्रत्येक तत्व के लिए एक 8-बाइट संख्या (64 बिट्स की एक डबल वास्तविकता) के रूप में काफी स्मृति का उपयोग करता है और प्रत्येक पाए गए प्राइम के लिए 8-बाइट संख्या। यह उत्तर 250 मिलियन और उससे अधिक के बारे में "बड़ी संख्या" के लिए काम नहीं करेगा क्योंकि यह जावास्क्रिप्ट निष्पादन मशीन के लिए उपलब्ध स्मृति की मात्रा से अधिक होगा।
निम्नलिखित जावास्क्रिप्ट कोड "अनंत" (असंबद्ध) को लागू करने वाला पृष्ठ जावा सेगेटेड इरेटोस्टेनेस की चलती चलनी उस समस्या से अधिक है कि इसमें केवल एक बिट-पैक 16 किलोबाइट पेज सेगमेंटेड सेविंग बफर (एक बिट एक संभावित प्राइम नंबर का प्रतिनिधित्व करता है) का उपयोग करता है और केवल वर्तमान पृष्ठ खंड में वर्तमान उच्चतम संख्या के वर्ग रूट तक आधार प्राइम्स के लिए भंडारण का उपयोग करता है, बिना किसी भंडारण की आवश्यकता के क्रम में वास्तविक पाए गए प्राइम; यह भी केवल केवल भी प्रधानमंत्री के रूप में अजीब कंपोजिट sieving द्वारा समय की बचत 2:
var SoEPgClass = (function() {
function SoEPgClass() {
this.bi = -1; // constructor resets the enumeration to start...
}
SoEPgClass.prototype.next = function() {
if (this.bi < 1) {
if (this.bi < 0) {
this.bi++;
this.lowi = 0; // other initialization done here...
this.bpa = [];
return 2;
} else { // bi must be zero:
var nxt = 3 + 2 * this.lowi + 262144; //just beyond the current page
this.buf = [];
for (var i = 0; i < 2048; i++) this.buf.push(0); // faster initialization 16 KByte's:
if (this.lowi <= 0) { // special culling for first page as no base primes yet:
for (var i = 0, p = 3, sqr = 9; sqr < nxt; i++, p += 2, sqr = p * p)
if ((this.buf[i >> 5] & (1 << (i & 31))) === 0)
for (var j = (sqr - 3) >> 1; j < 131072; j += p)
this.buf[j >> 5] |= 1 << (j & 31);
} else { // other than the first "zeroth" page:
if (!this.bpa.length) { // if this is the first page after the zero one:
this.bps = new SoEPgClass(); // initialize separate base primes stream:
this.bps.next(); // advance past the only even prime of 2
this.bpa.push(this.bps.next()); // keep the next prime (3 in this case)
}
// get enough base primes for the page range...
for (var p = this.bpa[this.bpa.length - 1], sqr = p * p; sqr < nxt;
p = this.bps.next(), this.bpa.push(p), sqr = p * p);
for (var i = 0; i < this.bpa.length; i++) { //for each base prime in the array
var p = this.bpa[i];
var s = (p * p - 3) >> 1; //compute the start index of the prime squared
if (s >= this.lowi) // adjust start index based on page lower limit...
s -= this.lowi;
else { //for the case where this isn't the first prime squared instance
var r = (this.lowi - s) % p;
s = (r != 0) ? p - r : 0;
}
//inner tight composite culling loop for given prime number across page
for (var j = s; j < 131072; j += p) this.buf[j >> 5] |= 1 << (j & 31);
}
}
}
}
//find next marker still with prime status
while (this.bi < 131072 && this.buf[this.bi >> 5] & (1 << (this.bi & 31))) .bi++;
if (this.bi < 131072) // within buffer: output computed prime
return 3 + ((this.lowi + this.bi++) * 2);
else { // beyond buffer range: advance buffer
this.bi = 0;
this.lowi += 131072;
return this.next(); // and recursively loop just once to make a new page buffer
}
};
return SoEPgClass;
})();
ऊपर कोड निम्नलिखित JavaScript कोड द्वारा दिए गए सीमा तक अभाज्य संख्या की गणना करने के लिए उपयोग किया जा सकता है:
window.onload = function() {
var elpsd = -new Date().getTime();
var top_num = 1000000000;
var cnt = 0;
var gen = new SoEPgClass();
while (gen.next() <= top_num) cnt++;
elpsd += (new Date()).getTime();
document.getElementById('content')
.innerText = 'Found ' + cnt + ' primes up to ' + top_num + ' in ' + elpsd + ' milliseconds.';
};
यदि जावास्क्रिप्ट कोड के उपरोक्त दो टुकड़े उसी फ़ोल्डर में app.js नामक फ़ाइल में डाल दिए गए हैं, तो निम्न HTML कोड जो कुछ भी नामित है।जब एक JavaScript निष्पादन इंजन पर चलने
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<title>Page Segmented Sieve of Eratosthenes in JavaScript</title>
<script src="app.js"></script>
</head>
<body>
<h1>Page Segmented Sieve of Eratosthenes in JavaScript.</h1>
<div id="content"></div>
</body>
</html>
इस कोड को एक अरब श्रृंखला के लिए चलनी सकता है कुछ 10 सेकंड के: एचटीएमएल, आप इसे में HTML फ़ाइल खोलने के द्वारा आपके ब्राउज़र में कोड को चलाने के लिए सक्षम हो जाएगा Google क्रोम के वी 8 इंजन जैसे जस्ट-इन-टाइम (जेआईटी) संकलन का उपयोग करना। चरम व्हील फैक्टरलाइजेशन और सबसे कम आधार प्राइम्स के पेज बफर के प्री-कूलिंग का उपयोग करके और लाभ प्राप्त किए जा सकते हैं, इस मामले में किए गए काम की मात्रा चार के आगे के कारक द्वारा काटा जा सकता है, जिसका अर्थ है कि प्राइम की संख्या गिना जा सकता है कुछ सेकंड में एक बिलियन तक (गिनती के लिए उपयोग की जाने वाली गणना की आवश्यकता नहीं होती है बल्कि पेज सेगमेंट बफर पर सीधे बिट गिनती टेबल का उपयोग कर सकते हैं), हालांकि कोड की जटिलता की लागत पर।
आप 'की सरणी # indexOf' और' सरणी # splice' – Alexander
आपका फ़ंक्शन उपयोग करके अपने चलनी जानबूझकर धीमी कर रहे हैं [[2], 3] के बजाय [2,3] 5 के इनपुट पर ... – loxxy