एक सीमा N तक सबसे कॉम्पैक्ट मैपिंग n → isprime (n) कैसे बनाएं?


152

स्वाभाविक रूप से, bool isprime(number)एक डेटा संरचना के लिए मैं क्वेरी कर सकता था।
मैं सर्वश्रेष्ठ एल्गोरिथ्म को परिभाषित करता हूं , वह एल्गोरिथ्म है जो रेंज (1, N] के लिए सबसे कम मेमोरी खपत के साथ एक डेटा संरचना का निर्माण करता है, जहां एन एक स्थिर है।
बस जो मैं देख रहा हूं उसका एक उदाहरण: मैं हर विषम संख्या का प्रतिनिधित्व कर सकता हूं। संख्याओं की दी गई सीमा (1, 10] के लिए एक बिट के साथ, 3 से शुरू होता है:1110

निम्नलिखित शब्दकोश को अधिक निचोड़ा जा सकता है, है ना? मैं कुछ काम के साथ पांच के गुणकों को समाप्त कर सकता था, लेकिन संख्या जो 1, 3, 7 या 9 के साथ समाप्त होती है, बिट्स की सरणी में होनी चाहिए।

मैं समस्या को कैसे हल करूं?


3
आपका अनुरोध थोड़ा अस्पष्ट है। आप एक हस्ताक्षर देते हैं जो एक ही संख्या का परीक्षण करता है, लेकिन फिर (1, N] की डेटा संरचना के लिए पूछता है। क्या आप एक ऐसा एल्गोरिथ्म चाहते हैं जो एक शब्दकोश <int, bool> या केवल एक-शॉट फ़ंक्शन उत्पन्न करता है जो एक एकल संख्या की जांच करता है। प्रधान है?
माइकल हरेन

@ मिचेल क्षमा करें, यह सबसे अच्छा विवरण है जिसके साथ मैं आ सकता हूं। जैसा कि आप कह रहे हैं कि मैं देख रहा हूँ: एक बूलियन शब्दकोश। मैं शब्दकोश के स्थान को कम करना चाहूंगा। धन्यवाद :)
आरा

1
यदि आप जो देख रहे हैं, वह पहले से ही पूछा गया है: stackoverflow.com/questions/1032427/…
बेन एस


जवाबों:


79

प्रायोगिक परीक्षण करने के कई तरीके हैं ।

आपके लिए क्वेरी करने के लिए वास्तव में डेटा संरचना नहीं है। यदि आपके पास परीक्षण करने के लिए बहुत सी संख्याएँ हैं, तो आपको संभवतः एक संभाव्य परीक्षण चलाना चाहिए क्योंकि वे अधिक तेज़ होते हैं, और फिर यह सुनिश्चित करने के लिए कि यह संख्या प्रधान है , यह निर्धारित करने के लिए एक नियतात्मक परीक्षण के साथ पालन करें।

आपको पता होना चाहिए कि सबसे तेज़ एल्गोरिदम के पीछे का गणित दिल के बेहोश होने के लिए नहीं है।


4
मिलर-राबिन के साथ शुरू करने के लिए एक लोकप्रिय तेजी से संभाव्य परीक्षण है।
क्यूर

214

सामान्य प्राइम टेस्टिंग के लिए सबसे तेज़ एल्गोरिथम AKS है । विकिपीडिया लेख में इसका वर्णन लंबाई और मूल पेपर के लिंक पर किया गया है।

यदि आप बड़ी संख्याओं को खोजना चाहते हैं, तो उन अपराधों पर गौर करें, जिनके विशेष रूप हैं जैसे कि मेर्सेन प्राइम्स

एल्गोरिथ्म जिसे मैं आमतौर पर लागू करता हूं (समझने और कोड करने में आसान) निम्नानुसार है (पायथन में):

def isprime(n):
    """Returns True if n is prime."""
    if n == 2:
        return True
    if n == 3:
        return True
    if n % 2 == 0:
        return False
    if n % 3 == 0:
        return False

    i = 5
    w = 2

    while i * i <= n:
        if n % i == 0:
            return False

        i += w
        w = 6 - w

    return True

यह क्लासिक O(sqrt(N))एल्गोरिथ्म का एक प्रकार है। यह इस तथ्य का उपयोग करता है कि एक प्राइम (2 और 3 को छोड़कर) फॉर्म का है 6k - 1या 6k + 1केवल इस फॉर्म के विभाजक को देखता है।

कभी-कभी, अगर मुझे वास्तव में गति चाहिए और सीमा सीमित है , तो मैं फ़र्मेट की छोटी प्रमेय के आधार पर एक छद्म प्राइम टेस्ट लागू करता हूं । अगर मैं वास्तव में अधिक गति चाहता हूं (यानी O (sqrt (N)) एल्गोरिदम से पूरी तरह बचें), तो मैं झूठी सकारात्मकता ( कारमाइकल नंबर देखें ) को प्राथमिकता देता हूं और एक द्विआधारी खोज करता हूं। यह अब तक का सबसे तेज परीक्षण है जिसे मैंने अभी तक लागू किया है, एकमात्र दोष यह है कि सीमा सीमित है।


7
दो सवाल: आप बेहतर क्या चर व्याख्या कर सकते हैं iऔर wकर रहे हैं, और किस रूप में मतलब है 6k-1और 6k+1? आपकी जानकारी के लिए धन्यवाद और कोड नमूना (जिसे मैं समझने की कोशिश कर रहा हूं)
स्वतंत्रता ०

6
@Freedom_Ben यहां आप जाएं, quora.com/…
एलन डोंग

6
लूप के हर चक्र की गणना करने के बजाय, एक बार sqrtकी गणना करना nऔर उसकी तुलना iकरना बेहतर नहीं होगा i * i?
पेड्रोस

3
@Dschoni ... लेकिन आप हमारे साथ साझा करने के लिए टिप्पणी क्षेत्रों में सबसे तेज़ कार्यान्वयन फिट नहीं कर सकते हैं?
ग्रीनएजजादे

3
यह नंबर 1 के लिए विफल रहता है :(
दामजान पाव्लिका

27

सबसे अच्छी विधि, मेरी राय में, जो पहले चला गया है उसका उपयोग करना है।

Nइंटरनेट पर पहले अपराधों की सूची Nमें कम से कम पचास मिलियन तक खिंचाव है । फ़ाइलों को डाउनलोड करें और उनका उपयोग करें, यह आपके द्वारा आने वाली किसी भी अन्य विधि की तुलना में बहुत तेज़ होने की संभावना है।

यदि आप अपने स्वयं के primes बनाने के लिए एक वास्तविक एल्गोरिथ्म चाहते हैं, तो विकिपीडिया के यहाँ सभी प्रकार के अच्छे सामान हैं , जिनमें इसे करने के विभिन्न तरीकों के लिंक, और यहाँ प्रधानमंत्री परीक्षण , प्रायिकता-आधारित और तेज़-निर्धारणात्मक दोनों विधियाँ शामिल हैं।

पहले अरब (या और भी अधिक) अपराधों को खोजने और उन्हें नेट पर प्रकाशित करने के लिए एक ठोस प्रयास होना चाहिए ताकि लोग इस काम को बार-बार करना बंद कर सकें और ... :-)


2
@ अहमद: दिलचस्प। क्या आपने उन फाइलों को डाउनलोड करने की कोशिश की है? ऐसा लगता है कि वे मौजूद नहीं हैं।
paxdiablo

अभी तक नहीं, मुझे डर है: मैं सिर्फ अपने लंच ब्रेक के दौरान जल्दी से देख रहा था। मैं उस लिंक को हटा दूंगा, जब उसके बारे में कुछ भी दुर्भावनापूर्ण हो। इसलिए क्षमा करें, मुझे वास्तव में पहले इसकी जांच करनी चाहिए थी।
हामेद

1
ऐसी सूची करते अस्तित्व। Ive उन्हें सालों पहले देखा था लेकिन उन्हें डाउनलोड करने की कभी परवाह नहीं की। सच्चाई यह है, वे बहुत सारे स्थान (अपेक्षाकृत बोलने वाले) लेते हैं, और उन कार्यक्रमों में शामिल नहीं होना चाहिए जिन्हें कोई बेचता या वितरित करता है। इसके अलावा, वे हमेशा और हमेशा के लिए अपूर्ण रहेंगे। इस तरह के कार्यक्रमों के उपयोग के दौरान अभ्यास में आने वाली प्रत्येक संख्या का परीक्षण करने के लिए यह अधिक समझ में आता है, क्योंकि किसी भी सूची की लंबाई की तुलना में उस तरह से कम परीक्षण किया जाएगा जो आपके पास हो सकती है। इसके अलावा, मुझे लगता है कि पैक्स नॉट प्राइम एल्गोरिदम के उद्देश्य को महसूस करते हैं, ज्यादातर समय, वास्तव में पहुंचने वाले अपराधों के बजाय दक्षता / गति का परीक्षण करना है।
कॉगिटोएर्गो कॉगिटोसम

2
@CogitoErgoCogitoSum, सहमत हूँ कि सभी अपराधों की सूची हमेशा के लिए पुरानी हो जाएगी क्योंकि मैंने गणितीय प्रमाण देखा है कि वे संख्या में अनंत हैं। हालाँकि, पहली xबार निर्मित होने के बाद पहले अपराधों की सूची अधूरी होने की संभावना नहीं होगी :-)
paxdiablo

1
सच है, लेकिन एक रैखिक फैशन में एक फ़ाइल से पढ़ने की तुलना में बेहतर भंडारण विधियां हैं। यदि आप वास्तव में पूर्व-निर्मित अपराधों के संग्रहीत सेट से पढ़ना चाहते हैं, तो अधिक जटिल डेटा संरचना का प्रयास करें जो समस्या को गति प्रदान करता है।
CogitoErgoCogitoSum

10
bool isPrime(int n)
{
    // Corner cases
    if (n <= 1)  return false;
    if (n <= 3)  return true;

    // This is checked so that we can skip 
    // middle five numbers in below loop
    if (n%2 == 0 || n%3 == 0) return false;

    for (int i=5; i*i<=n; i=i+6)
        if (n%i == 0 || n%(i+2) == 0)
           return false;

    return true;
}

यह AKS एल्गोरिथ्म के ऊपर सिर्फ c ++ कार्यान्वयन है


1
इसके सबसे कुशल निर्धारक एल्गोरिदम Ive में से एक है, हाँ, लेकिन इसका AKS का कार्यान्वयन नहीं है। AKS प्रणाली एल्गोरिथ्म उल्लिखित की तुलना में बहुत नया है। यह यकीनन अधिक कुशल है, लेकिन संभावित रूप से बड़े खगोलीय / द्विपद गुणांक के कारण इसे लागू करना, कुछ हद तक मुश्किल है।
CogitoErgoCogitoSum

यह डेर्री लीही के (गैर-) उत्तर (जावा के बजाय सी के अलावा ) से कैसे भिन्न है ? यह कैसे जवाब देता है What is the algorithm that produces a data structure with lowest memory consumption for the range (1, N]?
ग्रेबियर 11

1
कैसे (n% i == 0 || n% (i + 2) == 0) 6n + 1 और 6n-1 के अनुरूप हैं?
यश

@YeshwanthVenkatesh: How does (n%i == 0 || n%(i+2) == 0) correspond to 6n+1 & 6n-1?उत्तर का हिस्सा विभिन्न भूमिकाओं के लिए है n, अन्य 6n + 1 & 6n-1 के बराबर (6n-1) +0 & (6n-1) + 2 * है।
ग्रेबर्ड

यह भी ध्यान दें कि यह एल्गोरिथ्म 5और के लिए सही परिणाम नहीं देता है 7
अथन क्लार्क

7

मैंने यह निर्धारित करने के लिए सबसे लोकप्रिय सुझावों की दक्षता की तुलना की कि क्या कोई संख्या प्रधान है। मैंने प्रयोग python 3.6किया ubuntu 17.10; मैंने 100.000 तक की संख्या के साथ परीक्षण किया (आप नीचे दिए गए मेरे कोड का उपयोग करके बड़ी संख्या के साथ परीक्षण कर सकते हैं)।

यह पहला प्लॉट फ़ंक्शंस की तुलना करता है (जो मेरे उत्तर में और नीचे दिए गए हैं), यह दिखाते हुए कि पिछले फ़ंक्शंस उतनी तेज़ी से नहीं बढ़ते हैं जितना कि नंबर बढ़ाते समय।

plot1

और दूसरे कथानक में हम देख सकते हैं कि अभाज्य संख्याओं के मामले में समय लगातार बढ़ता है, लेकिन गैर-अभाज्य संख्याएं समय में इतनी तेजी से नहीं बढ़ती हैं (क्योंकि उनमें से अधिकांश को जल्दी समाप्त किया जा सकता है)।

plot2

यहां मेरे द्वारा उपयोग किए जाने वाले कार्य हैं:

  1. इस उत्तर और इस उत्तर ने एक निर्माण का सुझाव दिया all():

    def is_prime_1(n):
        return n > 1 and all(n % i for i in range(2, int(math.sqrt(n)) + 1))
    
  2. इस उत्तर में लूप के कुछ प्रकार का उपयोग किया गया था:

    def is_prime_2(n):
        if n <= 1:
            return False
        if n == 2:
            return True
        if n == 3:
            return True
        if n % 2 == 0:
            return False
        if n % 3 == 0:
            return False
    
        i = 5
        w = 2
        while i * i <= n:
            if n % i == 0:
                return False
            i += w
            w = 6 - w
    
        return True
    
  3. इस उत्तर में एक forलूप वाला संस्करण शामिल था :

    def is_prime_3(n):
        if n <= 1:
            return False
    
        if n % 2 == 0 and n > 2:
            return False
    
        for i in range(3, int(math.sqrt(n)) + 1, 2):
            if n % i == 0:
                return False
    
        return True
    
  4. और मैंने दूसरे उत्तरों में से कुछ विचारों को एक नए में मिलाया:

    def is_prime_4(n):
        if n <= 1:          # negative numbers, 0 or 1
            return False
        if n <= 3:          # 2 and 3
            return True
        if n % 2 == 0 or n % 3 == 0:
            return False
    
        for i in range(5, int(math.sqrt(n)) + 1, 2):
            if n % i == 0:
                return False
    
        return True
    

यहाँ वेरिएंट की तुलना करने के लिए मेरी स्क्रिप्ट है:

import math
import pandas as pd
import seaborn as sns
import time
from matplotlib import pyplot as plt


def is_prime_1(n):
    ...
def is_prime_2(n):
    ...
def is_prime_3(n):
    ...
def is_prime_4(n):
    ...

default_func_list = (is_prime_1, is_prime_2, is_prime_3, is_prime_4)

def assert_equal_results(func_list=default_func_list, n):
    for i in range(-2, n):
        r_list = [f(i) for f in func_list]
        if not all(r == r_list[0] for r in r_list):
            print(i, r_list)
            raise ValueError
    print('all functions return the same results for integers up to {}'.format(n))

def compare_functions(func_list=default_func_list, n):
    result_list = []
    n_measurements = 3

    for f in func_list:
        for i in range(1, n + 1):
            ret_list = []
            t_sum = 0
            for _ in range(n_measurements):
                t_start = time.perf_counter()
                is_prime = f(i)
                t_end = time.perf_counter()

                ret_list.append(is_prime)
                t_sum += (t_end - t_start)

            is_prime = ret_list[0]
            assert all(ret == is_prime for ret in ret_list)
            result_list.append((f.__name__, i, is_prime, t_sum / n_measurements))

    df = pd.DataFrame(
        data=result_list,
        columns=['f', 'number', 'is_prime', 't_seconds'])
    df['t_micro_seconds'] = df['t_seconds'].map(lambda x: round(x * 10**6, 2))
    print('df.shape:', df.shape)

    print()
    print('', '-' * 41)
    print('| {:11s} | {:11s} | {:11s} |'.format(
        'is_prime', 'count', 'percent'))
    df_sub1 = df[df['f'] == 'is_prime_1']
    print('| {:11s} | {:11,d} | {:9.1f} % |'.format(
        'all', df_sub1.shape[0], 100))
    for (is_prime, count) in df_sub1['is_prime'].value_counts().iteritems():
        print('| {:11s} | {:11,d} | {:9.1f} % |'.format(
            str(is_prime), count, count * 100 / df_sub1.shape[0]))
    print('', '-' * 41)

    print()
    print('', '-' * 69)
    print('| {:11s} | {:11s} | {:11s} | {:11s} | {:11s} |'.format(
        'f', 'is_prime', 't min (us)', 't mean (us)', 't max (us)'))
    for f, df_sub1 in df.groupby(['f', ]):
        col = df_sub1['t_micro_seconds']
        print('|{0}|{0}|{0}|{0}|{0}|'.format('-' * 13))
        print('| {:11s} | {:11s} | {:11.2f} | {:11.2f} | {:11.2f} |'.format(
            f, 'all', col.min(), col.mean(), col.max()))
        for is_prime, df_sub2 in df_sub1.groupby(['is_prime', ]):
            col = df_sub2['t_micro_seconds']
            print('| {:11s} | {:11s} | {:11.2f} | {:11.2f} | {:11.2f} |'.format(
                f, str(is_prime), col.min(), col.mean(), col.max()))
    print('', '-' * 69)

    return df

फ़ंक्शन चलाना compare_functions(n=10**5)(100.000 तक की संख्या) मुझे यह आउटपुट मिलता है:

df.shape: (400000, 5)

 -----------------------------------------
| is_prime    | count       | percent     |
| all         |     100,000 |     100.0 % |
| False       |      90,408 |      90.4 % |
| True        |       9,592 |       9.6 % |
 -----------------------------------------

 ---------------------------------------------------------------------
| f           | is_prime    | t min (us)  | t mean (us) | t max (us)  |
|-------------|-------------|-------------|-------------|-------------|
| is_prime_1  | all         |        0.57 |        2.50 |      154.35 |
| is_prime_1  | False       |        0.57 |        1.52 |      154.35 |
| is_prime_1  | True        |        0.89 |       11.66 |       55.54 |
|-------------|-------------|-------------|-------------|-------------|
| is_prime_2  | all         |        0.24 |        1.14 |      304.82 |
| is_prime_2  | False       |        0.24 |        0.56 |      304.82 |
| is_prime_2  | True        |        0.25 |        6.67 |       48.49 |
|-------------|-------------|-------------|-------------|-------------|
| is_prime_3  | all         |        0.20 |        0.95 |       50.99 |
| is_prime_3  | False       |        0.20 |        0.60 |       40.62 |
| is_prime_3  | True        |        0.58 |        4.22 |       50.99 |
|-------------|-------------|-------------|-------------|-------------|
| is_prime_4  | all         |        0.20 |        0.89 |       20.09 |
| is_prime_4  | False       |        0.21 |        0.53 |       14.63 |
| is_prime_4  | True        |        0.20 |        4.27 |       20.09 |
 ---------------------------------------------------------------------

फिर, फ़ंक्शन चलाने compare_functions(n=10**6)(संख्या 1.000.000 तक) मुझे यह आउटपुट मिलता है:

df.shape: (4000000, 5)

 -----------------------------------------
| is_prime    | count       | percent     |
| all         |   1,000,000 |     100.0 % |
| False       |     921,502 |      92.2 % |
| True        |      78,498 |       7.8 % |
 -----------------------------------------

 ---------------------------------------------------------------------
| f           | is_prime    | t min (us)  | t mean (us) | t max (us)  |
|-------------|-------------|-------------|-------------|-------------|
| is_prime_1  | all         |        0.51 |        5.39 |     1414.87 |
| is_prime_1  | False       |        0.51 |        2.19 |      413.42 |
| is_prime_1  | True        |        0.87 |       42.98 |     1414.87 |
|-------------|-------------|-------------|-------------|-------------|
| is_prime_2  | all         |        0.24 |        2.65 |      612.69 |
| is_prime_2  | False       |        0.24 |        0.89 |      322.81 |
| is_prime_2  | True        |        0.24 |       23.27 |      612.69 |
|-------------|-------------|-------------|-------------|-------------|
| is_prime_3  | all         |        0.20 |        1.93 |       67.40 |
| is_prime_3  | False       |        0.20 |        0.82 |       61.39 |
| is_prime_3  | True        |        0.59 |       14.97 |       67.40 |
|-------------|-------------|-------------|-------------|-------------|
| is_prime_4  | all         |        0.18 |        1.88 |      332.13 |
| is_prime_4  | False       |        0.20 |        0.74 |      311.94 |
| is_prime_4  | True        |        0.18 |       15.23 |      332.13 |
 ---------------------------------------------------------------------

मैंने परिणामों को प्लॉट करने के लिए निम्न स्क्रिप्ट का उपयोग किया:

def plot_1(func_list=default_func_list, n):
    df_orig = compare_functions(func_list=func_list, n=n)
    df_filtered = df_orig[df_orig['t_micro_seconds'] <= 20]
    sns.lmplot(
        data=df_filtered, x='number', y='t_micro_seconds',
        col='f',
        # row='is_prime',
        markers='.',
        ci=None)

    plt.ticklabel_format(style='sci', axis='x', scilimits=(3, 3))
    plt.show()

6

विकिपीडिया के अनुसार, Sieve of Eratosthenes में जटिलता है O(n * (log n) * (log log n))और O(n)स्मृति की आवश्यकता है - इसलिए यदि आप विशेष रूप से बड़ी संख्या के लिए परीक्षण नहीं कर रहे हैं तो यह शुरू करने के लिए एक बहुत अच्छी जगह है।


क्षमा करें, मुझे पता है कि मेरा विवरण अस्पष्ट है, मैं SOE को नहीं देख रहा हूं :) मेरी टिप्पणी देखिए @Michael
AraK

6

एक सिम्पी का उपयोग कर सकते हैं

import sympy

sympy.ntheory.primetest.isprime(33393939393929292929292911111111)

True

सिंपल डॉक्स से। पहला कदम तुच्छ कारकों की तलाश में है, जो अगर पाया जाता है तो शीघ्र वापसी में सक्षम होता है। अगला, यदि चलनी काफी बड़ी है, तो चलनी पर द्विभाजन खोज का उपयोग करें। छोटी संख्या के लिए, नियतात्मक मिलर-राबिन परीक्षणों का एक सेट उन ठिकानों के साथ किया जाता है जिन्हें उनकी सीमा में कोई प्रतिपक्ष नहीं जाना जाता है। अंत में यदि संख्या 2 ^ 64 से बड़ी है, तो एक मजबूत BPSW परीक्षण किया जाता है। हालांकि यह एक संभावित प्राइम टेस्ट है और हमारा मानना ​​है कि काउंटरटेक्मेन्स मौजूद हैं, कोई ज्ञात काउंटरटेक्सम नहीं हैं


एक एल्गोरिथ्म अच्छी तरह से परिभाषित चरणों का एक क्रम है जो एक समस्या के सार समाधान को परिभाषित करता है। - प्रस्तुत कोड में चरणों का बोधगम्य अनुक्रम क्या है ? इसका क्या है memory consumption?
ग्रेबियर्ड

2
@greybeard। सिंपल डॉक्स से। पहला कदम तुच्छ कारकों की तलाश में है, जो अगर पाया जाता है तो शीघ्र वापसी में सक्षम होता है। अगला, अगर छलनी काफी बड़ी है, छलनी पर द्वि घातुमान खोज का उपयोग करें। छोटी संख्या के लिए, नियतात्मक मिलर-राबिन परीक्षणों का एक सेट उन ठिकानों के साथ किया जाता है जिन्हें उनकी सीमा में कोई प्रतिपक्ष नहीं जाना जाता है। अंत में यदि संख्या 2 ^ 64 से बड़ी है, तो एक मजबूत बीपीएसडब्ल्यू परीक्षण किया जाता है। हालांकि यह एक संभावित प्राइम टेस्ट है और हमारा मानना ​​है कि काउंटरटेक्मेन्स मौजूद हैं, कोई भी ज्ञात काउंटरटेम्पल्स मौजूद नहीं हैं।
LetzerWille

6

पायथन 3 में:

def is_prime(a):
    if a < 2:
        return False
    elif a!=2 and a % 2 == 0:
        return False
    else:
        return all (a % i for i in range(3, int(a**0.5)+1))

स्पष्टीकरण: एक अभाज्य संख्या एक संख्या है जो केवल अपने आप से विभाज्य है और 1. Ex: 2,3,5,7 ...

1) अगर एक <2: अगर "a" 2 से कम है तो यह प्रमुख नहीं है।

2) एलीफ ए! = 2 और एक% 2 == 0: यदि "ए" 2 से विभाज्य है, तो निश्चित रूप से यह एक प्रमुख नहीं है। लेकिन अगर a = 2 हम इसका मूल्यांकन नहीं करना चाहते हैं क्योंकि यह एक प्रमुख संख्या है। इसलिए हालत ए! = 2

3) सभी (रेंज में i के लिए एक% i (3, int ( 0.5) +1)) लौटाएँ: ** सबसे पहले अजगर में सभी () कमांड क्या करती है। 3 से शुरू करके हम "a" को उसके वर्गमूल (a ** 0.5) तक विभाजित करते हैं। यदि "a" विभाज्य है तो आउटपुट झूठा होगा। वर्गमूल क्यों? मान लीजिए कि एक = 16। 16 = 4. का वर्गमूल हमें 15 तक मूल्यांकन करने की आवश्यकता नहीं है। हमें यह कहने के लिए केवल 4 तक की जांच करने की आवश्यकता है कि यह एक प्रमुख नहीं है।

अतिरिक्त: एक सीमा के भीतर सभी प्रमुख संख्या खोजने के लिए एक लूप।

for i in range(1,100):
    if is_prime(i):
        print("{} is a prime number".format(i))

1
यह ओलेक्ज़ेंडर शिमहिलुक के जवाब से कैसे अलग है ? (दोनों को एक "चरण 2" में याद आती है range())
ग्रेबियर्ड

1
यदि कोई संख्या सम है तो वह अभाज्य (2 को छोड़कर) नहीं है। तो कोई संख्या के लिए जाँच करने की आवश्यकता है। यदि आप एक सीमा के भीतर प्राइम नंबर प्राप्त करना चाहते हैं तो यह बहुत तेज़ होगा। यह सीधे सम संख्याओं को छोड़ देगा।
दीप वृद्धि


3

बड़ी संख्या के लिए आप आसानी से यह जांच नहीं कर सकते कि उम्मीदवार संख्या N, sqrt (N) से कम संख्याओं में से किसी के द्वारा विभाज्य है या नहीं। बहुत अधिक स्केलेबल परीक्षण उपलब्ध हैं, जैसे कि मिलर-राबिन परिमाण परीक्षण । नीचे आपके पास अजगर में कार्यान्वयन है:

def is_prime(x):
    """Fast implementation fo Miller-Rabin primality test, guaranteed to be correct."""
    import math
    def get_sd(x):
        """Returns (s: int, d: int) for which x = d*2^s """
        if not x: return 0, 0
        s = 0
        while 1:
            if x % 2 == 0:
                x /= 2
                s += 1
            else:
                return s, x
    if x <= 2:
        return x == 2
    # x - 1 = d*2^s
    s, d = get_sd(x - 1)
    if not s:
        return False  # divisible by 2!
    log2x = int(math.log(x) / math.log(2)) + 1
    # As long as Riemann hypothesis holds true, it is impossible
    # that all the numbers below this threshold are strong liars.
    # Hence the number is guaranteed to be a prime if no contradiction is found.
    threshold = min(x, 2*log2x*log2x+1)
    for a in range(2, threshold):
        # From Fermat's little theorem if x is a prime then a^(x-1) % x == 1
        # Hence the below must hold true if x is indeed a prime:
        if pow(a, d, x) != 1:
            for r in range(0, s):
                if -pow(a, d*2**r, x) % x == 1:
                    break
            else:
                # Contradicts Fermat's little theorem, hence not a prime.
                return False
    # No contradiction found, hence x must be a prime.
    return True

आप इसका उपयोग बड़ी संख्याओं को खोजने के लिए कर सकते हैं:

x = 10000000000000000000000000000000000000000000000000000000000000000000000000000
for e in range(1000):
    if is_prime(x + e):
        print('%d is a prime!' % (x + e))
        break

# 10000000000000000000000000000000000000000000000000000000000000000000000000133 is a prime!

यदि आप रैंडम पूर्णांक का परीक्षण कर रहे हैं, तो शायद आप पहले यह परीक्षण करना चाहते हैं कि क्या मिलर-राबिन को कॉल करने से पहले उम्मीदवार संख्या किसी भी छोटे से 1000 के विभाजनों से विभाजित है या नहीं। यह आपको 10444344345 जैसे स्पष्ट गैर-primes को फ़िल्टर करने में मदद करेगा।


यह मिलर की परीक्षा है। मिलर-राबिन परीक्षण संभाव्य संस्करण है जहां पर्याप्त आत्मविश्वास प्राप्त होने तक यादृच्छिक रूप से चयनित ठिकानों का परीक्षण किया जाता है। इसके अलावा, मिलर परीक्षण सीधे रीमैन हाइपोथीसिस पर निर्भर नहीं है, लेकिन द्विघात डरिकलेट पात्रों के लिए सामान्यीकृत रीमैन हाइपोथिसिस (जीआरएच) (मुझे पता है कि यह एक कौर है, और मुझे यह समझ में नहीं आता है)। जिसका अर्थ है कि Riemann परिकल्पना के लिए एक संभावित प्रमाण भी GRH पर लागू नहीं हो सकता है, और इसलिए मिलर परीक्षण सही साबित नहीं होता है। इससे भी बदतर मामला होगा यदि जीआरएच को अप्रमाणित किया जाता है।
अर्ने वोगेल

2

पार्टी के लिए बहुत देर हो चुकी है, लेकिन उम्मीद है कि इससे मदद मिलेगी। यदि आप बड़े अपराधों की तलाश कर रहे हैं तो यह प्रासंगिक है:

बड़ी विषम संख्याओं का परीक्षण करने के लिए आपको फ़र्मेट-टेस्ट और / या मिलर-राबिन परीक्षण का उपयोग करने की आवश्यकता होती है।

ये परीक्षण मॉड्यूलर घातांक का उपयोग करते हैं जो कि काफी महंगा होता है, nबिट्स घातांक के लिए आपको कम से कम nबड़े इंट गुणा और nबड़े इंट डिवीजन की आवश्यकता होती है। जिसका अर्थ है कि मॉड्यूलर एक्सपोनेंचर की जटिलता O (n।) है।

इसलिए बड़ी बंदूकों का उपयोग करने से पहले, आपको कुछ परीक्षण डिवीजनों को करने की आवश्यकता है। लेकिन इसे भोलेपन से न करें, उन्हें जल्दी करने का एक तरीका है। पहले बड़े अपराधों के लिए आपके द्वारा उपयोग किए जाने वाले शब्दों में एक साथ कई गुना गुणा करें। यदि आप 32 बिट शब्दों का उपयोग करते हैं, तो 3 * 5 * 7 * 11 * 13 * 17 * 19 * 23 * 29 = 3234846615 से गुणा करें और यूक्लिडियन एल्गोरिथ्म का उपयोग करके आपके द्वारा परीक्षण किए गए नंबर के साथ सबसे बड़े सामान्य भाजक की गणना करें। पहले चरण के बाद संख्या शब्द के आकार के नीचे कम हो जाती है और पूर्ण बड़े पूर्णांक विभाजनों के प्रदर्शन के बिना एल्गोरिथ्म को जारी रखती है। यदि GCD! = 1, इसका मतलब है कि आपके द्वारा गुणा किए गए सभी अपराधों में से एक संख्या को विभाजित करता है, तो आपके पास एक प्रमाण है कि यह प्रमुख है। फिर 31 * 37 * 41 * 43 * 47 = 95041567 के साथ जारी रखें, और इसी तरह।

एक बार जब आप कई सौ (या हज़ार) प्राइम का परीक्षण कर लेते हैं, तो आप संख्या की पुष्टि करने के लिए मिलर-राबिन परीक्षण के 40 राउंड कर सकते हैं, यह सुनिश्चित करने के लिए कि 40 राउंड के बाद आप निश्चित हो सकते हैं कि संख्या प्राइम है, केवल 2 ^ -80 मौका है नहीं (यह अधिक संभावना है कि आपके हार्डवेयर में खराबी है ...)।


1

मुझे एक प्रमुख समारोह मिला है जो तब तक काम करता है जब तक (2 ^ 61) -1 यहाँ:

from math import sqrt
def isprime(num): num > 1 and return all(num % x for x in range(2, int(sqrt(num)+1)))

स्पष्टीकरण:

इस all()कार्य को फिर से परिभाषित किया जा सकता है:

def all(variables):
    for element in variables:
        if not element: return False
    return True

all()समारोह सिर्फ bools / संख्या और रिटर्न की एक श्रृंखला के माध्यम से चला जाता है Falseअगर यह 0 या देखता है False

sqrt()समारोह बस कर रही है वर्गमूल एक नंबर के।

उदाहरण के लिए:

>>> from math import sqrt
>>> sqrt(9)
>>> 3
>>> sqrt(100)
>>> 10

num % xभाग रिटर्न शेष संख्या / एक्स की।

अंत में, range(2, int(sqrt(num)))इसका मतलब है कि यह एक सूची बनाएगा जो 2 से शुरू होता है और समाप्त होता हैint(sqrt(num)+1)

रेंज के बारे में अधिक जानकारी के लिए, इस वेबसाइट पर एक नज़र डालें !

यदि num > 1पार्ट चर num1 से बड़ा है, तो भाग केवल चेक कर रहा है, क्योंकि 1 और 0 को प्राइम नंबर नहीं माना जाता है।

मुझे उम्मीद है कि इससे मदद मिली :)


कृपया तर्क दें कि यह कैसे the bestएल्गोरिदम है, या एक अच्छा भी है।
ग्रेबर्ड

@greybeard, यहां के अधिकांश प्रमुख कार्य (2 ^ 31) -1 तक नहीं जाते हैं या उच्च संख्या के लिए बहुत लंबे समय तक चलते हैं, लेकिन मेरा तब तक काम करता है (2 ^ 61) -1, इसलिए आप जांच सकते हैं कि क्या एक संख्या एक व्यापक के साथ अभाज्य है संख्या की सीमा।
WhyAreYouReadingThis

1

पायथन में:

def is_prime(n):
    return not any(n % p == 0 for p in range(2, int(math.sqrt(n)) + 1))

गणितीय औपचारिकता से पायथन में अधिक प्रत्यक्ष रूपांतरण सभी का उपयोग करेगा (n% p! = 0 ...) , लेकिन इसके लिए p के सभी मूल्यों के सख्त मूल्यांकन की आवश्यकता है। नहीं किसी भी संस्करण जल्दी समाप्त कर सकते हैं, तो एक सही मूल्य पाया जाता है।


राइट "ऑल (एन% पी! = 0 ...), लेकिन इसके लिए पी के सभी मूल्यों के सख्त मूल्यांकन की आवश्यकता है" - यह गलत है। anyऔर allदोनों जल्दी बाहर निकलेंगे । तो पहले pजहां n % pहै 0, allबाहर निकल जाएगा।
ऐरॉइड

1

Primes नंबर जावास्क्रिप्ट के लिए सबसे अच्छा एल्गोरिथ्म

 function isPrime(num) {
      if (num <= 1) return false;
      else if (num <= 3) return true;
      else if (num % 2 == 0 || num % 3 == 0) return false;
      var i = 5;
      while (i * i <= num) {
        if (num % i == 0 || num % (i + 2) == 0) return false;
        i += 6;
      }
      return true
    }

1
import math
import time


def check_prime(n):

    if n == 1:
        return False

    if n == 2:
        return True

    if n % 2 == 0:
        return False

    from_i = 3
    to_i = math.sqrt(n) + 1

    for i in range(from_i, int(to_i), 2):
        if n % i == 0:
            return False
    return True

1

एक अभाज्य संख्या कोई भी संख्या है जो केवल 1 और स्वयं से विभाज्य है। अन्य सभी संख्याओं को संयुक्त कहा जाता है

प्राइम नंबर खोजने का सबसे सरल तरीका, यह जांचना है कि इनपुट नंबर कंपोजिट नंबर है:

    function isPrime(number) {
        // Check if a number is composite
        for (let i = 2; i < number; i++) {
            if (number % i === 0) {
                return false;
            }
        }
        // Return true for prime numbers
        return true;
    }

कार्यक्रम को numberसभी पूर्ण संख्याओं के मूल्य को 1 से और उसके मूल्य तक विभाजित करना है । यदि इस संख्या को न केवल एक से ही विभाजित किया जा सकता है और यह एक संयुक्त संख्या है।

चर का प्रारंभिक मूल्य i2 होना चाहिए क्योंकि प्राइम और कम्पोजिट संख्या दोनों को समान रूप से 1 से विभाजित किया जा सकता है।

    for (let i = 2; i < number; i++)

फिर उसी कारण iसे कम है number। प्राइम और कम्पोजिट दोनों संख्याओं को समान रूप से खुद से विभाजित किया जा सकता है। इसलिए इसकी जांच करने का कोई कारण नहीं है।

फिर हम जांचते हैं कि शेष ऑपरेटर का उपयोग करके चर को समान रूप से विभाजित किया जा सकता है या नहीं।

    if (number % i === 0) {
        return false;
    }

यदि शेष शून्य है, तो इसका मतलब है कि numberसमान रूप से विभाजित किया जा सकता है, इसलिए एक संयुक्त संख्या है और गलत वापस आ रहा है।

यदि दर्ज संख्या शर्त को पूरा नहीं करती है, तो इसका मतलब है कि यह एक प्रमुख संख्या है और फ़ंक्शन सही है।


1
(हालांकि मुझे लगता है कि सबसे अच्छीsimplest की एक मान्य व्याख्या :) सवाल यह है कि क्या एक संख्या अभाज्य है, जाँच के लिए सबसे अच्छा एल्गोरिथ्म क्या है? : जहां लाभप्रद है विभाजन के लिए जाँच कर रहा है ? किस बारे में ? अन्य 3³ उत्तरों के समझने योग्य लोग क्या कहते हैं? number / 2 < i < numbernumber < i*i
ग्रेबर्ड

1

मुझे 64 बिट पूर्णांक के लिए सही समाधान सुझाते हैं। सी # का उपयोग करने के लिए क्षमा करें। आपने अपनी पहली पोस्ट में इसे पहले से ही अजगर के रूप में निर्दिष्ट नहीं किया है। मुझे आशा है कि आप एक सरल modPow फ़ंक्शन पा सकते हैं और इसका आसानी से विश्लेषण कर सकते हैं।

public static bool IsPrime(ulong number)
{
    return number == 2 
        ? true 
        : (BigInterger.ModPow(2, number, number) == 2 
            ? (number & 1 != 0 && BinarySearchInA001567(number) == false) 
            : false)
}

public static bool BinarySearchInA001567(ulong number)
{
    // Is number in list?
    // todo: Binary Search in A001567 (https://oeis.org/A001567) below 2 ^ 64
    // Only 2.35 Gigabytes as a text file http://www.cecm.sfu.ca/Pseudoprimes/index-2-to-64.html
}

1
bool isPrime(int n) {
if(n <= 3)
    return (n > 1)==0? false: true;
else if(n%2 == 0 || n%3 == 0)
    return false;

int i = 5;

while(i * i <= n){
    if(n%i == 0 || (n%(i+2) == 0))
        return false;
    i = i + 6;
}

return true;
}

किसी भी संख्या के लिए, यह जांचने के लिए न्यूनतम पुनरावृत्तियों कि संख्या प्रधान है या नहीं, संख्या की 2 से वर्गमूल तक हो सकती है। पुनरावृत्तियों को कम करने के लिए, और भी अधिक, हम जांच सकते हैं कि क्या संख्या 2 या 3 से विभाज्य है क्योंकि अधिकतम संख्या 2 या 3 से विभाज्य होने पर जाँच करके समाप्त किया जा सकता है। आगे 3 से अधिक कोई भी अभाज्य संख्या 6k के रूप में व्यक्त की जा सकती है +1 या 6k-1। तो पुनरावृति 6k + 1 से संख्या की वर्गमूल तक जा सकती है।


1
बेहतर होगा कि अगर आप एडिट का उपयोग करके अपने उत्तर में कुछ स्पष्टीकरण जोड़ते हैं । कई पाठकों के लिए यह स्पष्ट नहीं हो सकता है कि आपका उत्तर एक अच्छा क्यों है, और यदि आपने अधिक समझाया तो वे आपसे सीख सकते हैं।
ब्रायन टॉम्पसेट -

0

सबसे छोटी मेमोरी? यह सबसे छोटा नहीं है, लेकिन सही दिशा में एक कदम है।

class PrimeDictionary {
    BitArray bits;

    public PrimeDictionary(int n) {
        bits = new BitArray(n + 1);
        for (int i = 0; 2 * i + 3 <= n; i++) {
            bits.Set(i, CheckPrimality(2 * i + 3));
        }
    }

    public PrimeDictionary(IEnumerable<int> primes) {
        bits = new BitArray(primes.Max());
        foreach(var prime in primes.Where(p => p != 2)) {
            bits.Set((prime - 3) / 2, true);
        }
    }

    public bool IsPrime(int k) {
        if (k == 2) {
            return true;
        }
        if (k % 2 == 0) {
            return false;
        }
        return bits[(k - 3) / 2];
    }
}

बेशक, आपको की परिभाषा निर्दिष्ट करनी होगी CheckPrimality


0

मुझे लगता है कि सबसे तेज एक मेरी विधि है जिसे मैंने बनाया है।

void prime(long long int number) {
    // Establishing Variables
    long long int i = 5;
    int w = 2;
    const long long int lim = sqrt(number);

    // Gets 2 and 3 out of the way
    if (number == 1) { cout << number << " is hard to classify. \n";  return; }
    if (number == 2) { cout << number << " is Prime. \n";  return; }
    if (number == 3) { cout << number << " is Prime. \n";  return; }

    // Tests Odd Ball Factors
    if (number % 2 == 0) { cout << number << " is not Prime. \n";  return; }
    if (number % 3 == 0) { cout << number << " is not Prime. \n";  return; }

    while (i <= lim) {
        if (number % i == 0) { cout << number << " is not Prime. \n";  return; }
        // Tests Number
        i = i + w; // Increments number
        w = 6 - i; // We already tested 2 and 3
        // So this removes testing multepules of this
    }
    cout << number << " is Prime. \n"; return;
}

1
एक गलती हो सकती है ... 6 - मैं?
हममम

0

एकेएस एल्गोरिथ्म के समान विचार जो उल्लेख किया गया है

public static boolean isPrime(int n) {

    if(n == 2 || n == 3) return true;
    if((n & 1 ) == 0 || n % 3 == 0) return false;
    int limit = (int)Math.sqrt(n) + 1;
    for(int i = 5, w = 2; i <= limit; i += w, w = 6 - w) {
        if(n % i == 0) return false;
        numChecks++;
    }
    return true;
}

1
AKS एल्गोरिथ्म से कोई संबंध नहीं ।
ग्रेबियर

लूप के लिए आपको "आई <= सीमा" की जांच करने की आवश्यकता नहीं है, यह "आई <सीमा" को कम करने के लिए पर्याप्त है। इसलिए हर पुनरावृत्ति में आप एक तुलना कम करते हैं।
एंड्रुशेंको अलेक्जेंडर

0

यह जानने के लिए कि किसी श्रेणी में संख्याएँ या संख्याएँ प्रधान हैं / नहीं।

#!usr/bin/python3

def prime_check(*args):
    for arg in args:
        if arg > 1:     # prime numbers are greater than 1
            for i in range(2,arg):   # check for factors
                if(arg % i) == 0:
                    print(arg,"is not Prime")
                    print(i,"times",arg//i,"is",arg)
                    break
            else:
                print(arg,"is Prime")
                
            # if input number is less than
            # or equal to 1, it is not prime
        else:
            print(arg,"is not Prime")
    return
    
# Calling Now
prime_check(*list(range(101)))  # This will check all the numbers in range 0 to 100 
prime_check(#anynumber)         # Put any number while calling it will check.

इस कोड को चलाएं यह एक सूची और एक विशेष संख्या के लिए काम करेगा
हर्ष सिंह

0
myInp=int(input("Enter a number: "))
if myInp==1:
    print("The number {} is neither a prime not composite no".format(myInp))
elif myInp>1:
    for i in range(2,myInp//2+1):
        if myInp%i==0:
            print("The Number {} is not a prime no".format(myInp))
            print("Because",i,"times",myInp//i,"is",myInp)
            break
    else:
        print("The Number {} is a prime no".format(myInp))
else:
    print("Alas the no {} is a not a prime no".format(myInp))

1
जब आप उत्तर लिखते हैं, भले ही यह सही हो, तो कृपया यह भी समझाएं कि आप क्या कर रहे हैं और क्यों कर रहे हैं। इस तरह से आपके उत्तर को पढ़ने वाले लोग आसानी से समझ सकते हैं कि आपने क्या हल किया है। धन्यवाद!
किम

1
ज़रूर किम, आपको यह बताने के लिए धन्यवाद। यह स्टाकेओवरफ़्लो में मेरा पहला कार्यक्रम है इसलिए मैं उपयुक्त टिप्पणी और स्पष्टीकरण जोड़ूंगा।
DKB

0
public static boolean isPrime(int number) {
 if(number < 2)
   return false;
 else if(number == 2 || number == 3)
        return true;
      else {
        for(int i=2;i<=number/2;i++)
           if(number%i == 0)
             return false;
           else if(i==number/2)
                return true;
      }
    return false;
}

0

आप कुछ इस तरह की कोशिश कर सकते हैं।

def main():
    try:
        user_in = int(input("Enter a number to determine whether the number is prime or not: "))
    except ValueError:
        print()
        print("You must enter a number!")
        print()
        return
    list_range = list(range(2,user_in+1))
    divisor_list = []
    for number in list_range:
        if user_in%number==0:
            divisor_list.append(number)
    if len(divisor_list) < 2:
        print(user_in, "is a prime number!")
        return
    else:
        print(user_in, "is not a prime number!")
        return
main()

यह प्रधानता के परीक्षण के लिए एक भयानक समाधान है। एक बार जब आप एक विभाजक ढूंढ लेते हैं , तो आपको उत्तर पता होता है, लेकिन यह कोड सभी विभाजकों को ढूंढता है और फिर निर्णय लेता है! और यह एक बूलियन के लिए ओपी के अनुरोध को अनदेखा करता है क्योंकि यह हमेशा लौटता है None
cdlane

@ LCDlane मुझे पता है कि यह बूलियन वापसी समारोह नहीं है, मैं अभी भी अजगर में एक शुरुआत कर रहा हूं और मुझे पता है कि यह बिल्कुल सही नहीं है, वैसे भी टिप्पणी करने के लिए धन्यवाद
पैट्रिक जेन

0

पिछले जवाबों में से अधिकांश सही हैं लेकिन एक संख्या को देखने के लिए परीक्षण करने का एक और तरीका है प्राइम नंबर। पुनश्चर्या के रूप में, अभाज्य संख्याएँ 1 से अधिक पूर्ण संख्याएँ हैं , जिनके केवल कारक 1 और स्वयं हैं। ( स्रोत )

उपाय:

आमतौर पर आप लूप का निर्माण कर सकते हैं और यह देखने के लिए अपना नंबर टेस्ट करना शुरू कर सकते हैं कि क्या यह 1,2,3 से विभाज्य है ... आप जिस नंबर का परीक्षण कर रहे हैं ... इत्यादि, लेकिन जाँच के समय को कम करने के लिए, आप अपने नंबर को विभाजित कर सकते हैं आपकी संख्या के मूल्य का आधा हिस्सा क्योंकि एक संख्या उसके मूल्य के आधे से ऊपर किसी भी चीज से बिल्कुल विभाज्य नहीं हो सकती है। उदाहरण यदि आप 100 देखना चाहते हैं तो एक प्रमुख संख्या है जिसे आप 50 तक लूप कर सकते हैं।

वास्तविक कोड :

def find_prime(number):
    if(number ==1):
        return False
    # we are dividiing and rounding and then adding the remainder to increment !
    # to cover not fully divisible value to go up forexample 23 becomes 11
    stop=number//2+number%2
    #loop through up to the half of the values
    for item in range(2,stop):
        if number%item==0:
           return False
        print(number)
    return True


if(find_prime(3)):
    print("it's a prime number !!")
else:
    print("it's not a prime")  

आपको केवल संख्या के वर्गमूल की जांच करने की आवश्यकता है, जो कि संख्या की तुलना में थोड़ा छोटा है। उदाहरण के लिए n = 100 के लिए आपको केवल 10 की जांच करने की आवश्यकता है, 50 की नहीं। क्यों? बिल्कुल वर्गाकार जड़ पर, दो कारक समान होते हैं। किसी भी अन्य कारक के लिए एक sqrt (n) से कम और दूसरा बड़ा होगा। इसलिए यदि हमने sqrt (n) को चेक-अप करने के समय तक एक नहीं देखा है, तो हम एक के बाद एक नहीं पाएंगे।
दनाज

0

हम इसे O (sqrt (n)) में लागू करने के लिए जावा स्ट्रीम का उपयोग कर सकते हैं; इस बात पर विचार करें कि कोई भी छोटा तरीका नहीं है, जो परिणाम को निर्धारित करने के लिए अनावश्यक होने पर ऑपरेशन को रोक देता है:

Scanner in = new Scanner(System.in);
int n = in.nextInt();
System.out.println(n == 2 ? "Prime" : IntStream.rangeClosed(2, ((int)(Math.sqrt(n)) + 1)).noneMatch(a -> n % a == 0) ? "Prime" : "Not Prime");

0

जावा -8 स्ट्रीम और लैम्ब्डा की मदद से इसे कुछ ही लाइनों में इस तरह लागू किया जा सकता है:

public static boolean isPrime(int candidate){
        int candidateRoot = (int) Math.sqrt( (double) candidate);
        return IntStream.range(2,candidateRoot)
                .boxed().noneMatch(x -> candidate % x == 0);
    }

प्रदर्शन O (sqrt (N)) के करीब होना चाहिए । शायद किसी को यह उपयोगी लगता है।


उम्मीदवार सीमा को शामिल करने के लिए "रेंज" को "रेंज क्लोज्ड" से बदला जाना चाहिए। साथ ही उम्मीदवार <2 मामले को संभाला जाना चाहिए।
डालमिक २


0

यहाँ मेरा जवाब पर ले लो:

def isprime(num):
    return num <= 3 or (num + 1) % 6 == 0 or (num - 1) % 6 == 0

यदि कोई गुण नीचे सत्य है, तो फ़ंक्शन सही लौटेगा। वे गुण गणितीय रूप से परिभाषित करते हैं कि एक प्रमुख क्या है।

  1. संख्या 3 से कम या बराबर है
  2. संख्या + 1 6 से विभाज्य है
  3. संख्या - 1 6 से विभाज्य है

>>> isprime(25)लौटता है True। आप बहुत ही आवश्यक आवश्यक स्थिति (2 या 3 से विभाजन) की जाँच कर रहे हैं, लेकिन यह पर्याप्त नहीं है ।
दनज

अच्छा है, आप इस संपत्ति से मेल खा रहे हैं: 3 से अधिक प्रत्येक अभाज्य संख्या 6n + 1 या 6n + 5 के रूप में है, लेकिन संख्या मौजूद है (25 के रूप में) जो कि 6n + 1 या 6n + 5 के रूप में हैं, लेकिन वे प्रधान नहीं हैं
लुइस फेलिप

0

जब मुझे तेज़ सत्यापन करना होता है, तो मैं इस सरल कोड को इनपुट के वर्गमूल से कम संख्या के बीच मूल विभाजन पर आधारित लिखता हूं।

def isprime(n):
    if n%2==0:
        return n==2
    else:
        cota = int(n**0.5)+1
        for ind in range(3,2,cota):
            if n%ind==0:
                print(ind)
                return False
        return True != n==1

isprime(22783)
  • True != n==1मामले से बचने के लिए अंतिम है n=1
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.