कसकर सीमा:
static const unsigned short primes_small[] = {0,2,3,5,7,11};
static unsigned long nth_prime_upper(unsigned long n) {
double fn = (double) n;
double flogn, flog2n, upper;
if (n < 6) return primes_small[n];
flogn = log(n);
flog2n = log(flogn);
if (n >= 688383) /* Dusart 2010 page 2 */
upper = fn * (flogn + flog2n - 1.0 + ((flog2n-2.00)/flogn));
else if (n >= 178974) /* Dusart 2010 page 7 */
upper = fn * (flogn + flog2n - 1.0 + ((flog2n-1.95)/flogn));
else if (n >= 39017) /* Dusart 1999 page 14 */
upper = fn * (flogn + flog2n - 0.9484);
else /* Modified from Robin 1983 for 6-39016 _only_ */
upper = fn * (flogn + 0.6000 * flog2n);
if (upper >= (double) ULONG_MAX) {
/* Adjust this as needed for your type and exception method */
if (n <= 425656284035217743UL) return 18446744073709551557UL;
fprintf(stderr, "nth_prime_upper overflow\n"; exit(-1);
}
return (unsigned long) ceil(upper);
}
ये कभी वास्तविक nth_prime से कम नहीं होना चाहिए, किसी भी 64-बिट इनपुट के लिए काम करना चाहिए, और या परिमाण के एक आदेश से सूत्र की तुलना में अधिक करीब हो रॉबिन पहले दिया गया था (या विंबब्लिक की जटिल सीमा-सीमित सूत्र)। मेरे उपयोग के लिए मेरे पास थोड़ा बड़ा प्राइम टेबल है, इसलिए अंतिम अनुमान को थोड़ा और मजबूत कर सकता है। तकनीकी रूप से सूत्रों से हम छत() के बजाय फर्श() का उपयोग कर सकते हैं लेकिन मुझे परिशुद्धता की चिंता है।
संपादित करें: इसे थोड़ा सुधारने के लिए एक और विकल्प अच्छी प्रधान गणना सीमाओं (उदाहरण के लिए एक्सलर 2014) को लागू करना और उन पर बाइनरी खोज करना है। इस विधि के लिए मेरा कोड उपरोक्त से ~ 10x लंबा (अभी भी मिलीसेकंड के नीचे चल रहा है) लेता है, लेकिन परिमाण के क्रम से त्रुटि प्रतिशत को कम कर सकता है।
आप वें प्रधानमंत्री के लिए एक अनुमान चाहते हैं, आप कर सकते हैं:
- सिपोला 1902 (Dusart 1999 पेज 12 या this paper देख मैं तीन शर्तों (एम = 2) के साथ साथ करने के लिए एक तीसरे क्रम सुधार कारक हैं। उपयोगी हो, लेकिन अधिक शर्तों के साथ यह बहुत अधिक हो जाता है। विकिपीडिया लिंक में दिखाया गया सूत्र यह सूत्र है (एम = 2 के साथ)। दो-टर्म उलटा ली या विपरीत रिमेंन आर का उपयोग बेहतर परिणाम देगा।
- गणना करें Dusart 2010 ऊपरी और निचली सीमाएं और परिणाम औसत। बहुत बुरा नहीं है, हालांकि मुझे लगता है कि भारित औसत का उपयोग करने पर संदेह बेहतर होगा क्योंकि सीमाएं समान रूप से तंग नहीं हैं।
- ली^{- 1} (एन) चूंकि ली (एन) प्रमुख गणना के लिए एक सभ्य अनुमान है, उलटा एक सभ्य nth_prime अनुमान है। यह, और बाकी सभी, समारोह पर एक बाइनरी खोज के रूप में काफी जल्दी किया जा सकता है।
- ली^{- 1} (एन) + ली^{- 1} (एसकर्ट (एन))/4 करीब, क्योंकि यह आर (एन)
- आर^{- 1} के विपरीत हो रहा है रिमेंन आर फ़ंक्शन निकटतम औसत अनुमान है जो मुझे पता है कि यह उचित है।
आखिरकार, यदि आपके पास एलएमओ कार्यान्वयन में से एक बहुत तेज़ प्राइम गिनती विधि है (अब तीन खुले स्रोत कार्यान्वयन हैं), तो आप एक तेज सटीक nth_prime विधि लिख सकते हैं। 10^10 वें प्राइम की कंप्यूटिंग कुछ मिलीसेकंड में की जा सकती है, और कुछ सेकंड में 10^13 वें (आधुनिक फास्ट मशीन पर)। अनुमान लगभग सभी आकारों पर काम करते हैं और बहुत बड़ी संख्या के लिए काम करते हैं, लेकिन सभी के पास "बड़े" साधनों का एक अलग विचार है।
बस अपनी चाकू सेगमेंट करें। और, निश्चित रूप से Eratosthenes। –
http://en.wikipedia.org/wiki/Prime_number_theorem#Approximations_for_the_nth_prime_number – drdaeman