সর্বাধিক কমপ্যাক্ট ম্যাপিং কীভাবে তৈরি করবেন এন limit ইসপ্রাইম (এন) একটি সীমা N পর্যন্ত?


152

স্বাভাবিকভাবেই, bool isprime(number)এমন কোনও ডেটা স্ট্রাকচারের জন্য আমি জিজ্ঞাসা করতে পারি।
আমি সেরা অ্যালগরিদমকে সংজ্ঞায়িত করি , এমন একটি অ্যালগরিদম হতে যা পরিসরের জন্য সর্বনিম্ন মেমরি খরচ সহ একটি ডেটা কাঠামো তৈরি করে (1, N], যেখানে এন একটি ধ্রুবক
I আমি যা খুঁজছি তার একটি উদাহরণ: আমি প্রতিটি বিজোড় সংখ্যার প্রতিনিধিত্ব করতে পারি একটি বিট উদাহরণ সহ প্রদত্ত সংখ্যার (1, 10] রেঞ্জের জন্য 3 থেকে শুরু হবে:1110

নিম্নলিখিত অভিধানটি আরও নিচু করা যায়, তাই না? আমি কিছু কাজের সাথে পাঁচটির গুণককে দূর করতে পারতাম, তবে 1, 3, 7 বা 9 দিয়ে শেষ হওয়া সংখ্যাগুলি অবশ্যই বিটের অ্যারেতে থাকতে হবে।

আমি কীভাবে সমস্যার সমাধান করব?


3
আপনার অনুরোধটি কিছুটা অস্পষ্ট। আপনি একটি স্বাক্ষর দিয়েছিলেন যা একটি একক সংখ্যা পরীক্ষা করে তবে তারপরে (1, N] এর ডেটা স্ট্রাকচারের জন্য জিজ্ঞাসা করে you প্রধান কি?
মাইকেল হরেন

@ মিশেল দুঃখিত, আমি এটির সাথে পুনরায় অভিনয় করতে পারলাম description আমি যা দেখছি তা হুবহু আপনি যেমন বলছেন: একটি বুলিয়ান অভিধান। আমি অভিধানের স্থানটি ছোট করতে চাই। ধন্যবাদ :)
আরাক

1
যদি আপনি এটির সন্ধান করছেন তবে এটি ইতিমধ্যে জিজ্ঞাসা করা হয়েছে: স্ট্যাকওভারফ্লো.com
বেন এস


সম্পর্কিত: মিলার
Py

উত্তর:


79

প্রাথমিকতা পরীক্ষা করার বিভিন্ন উপায় রয়েছে ।

আপনার জিজ্ঞাসা করার জন্য সত্যই কোনও ডেটা কাঠামো নেই। যদি আপনার পরীক্ষার জন্য প্রচুর সংখ্যা থাকে তবে আপনার সম্ভবত একটি সম্ভাব্য পরীক্ষা চালানো উচিত যেহেতু সেগুলি দ্রুত হয় এবং তারপরে সংখ্যাটি প্রধান কিনা তা নিশ্চিত করার জন্য এটি একটি নির্মাতাপূর্ণ পরীক্ষা দিয়ে অনুসরণ করুন ।

আপনার জানা উচিত যে দ্রুততম অ্যালগরিদমের পিছনে গণিতটি হৃদয়ের হতাশার জন্য নয়।


4
মিলার-রবিন শুরু করার জন্য একটি জনপ্রিয় দ্রুত সম্ভাব্য পরীক্ষা test
qwr

214

সাধারণ প্রাথমিক পরীক্ষার জন্য দ্রুততম অ্যালগরিদম হ'ল একেএস । উইকিপিডিয়া নিবন্ধটি মূল কাগজের দৈর্ঘ্যে এবং লিঙ্কগুলিতে এটিকে বর্ণনা করে।

আপনি যদি বড় সংখ্যক সন্ধান করতে চান তবে মিরসেন প্রাইমসের মতো বিশেষ ফর্ম রয়েছে এমন প্রাইমগুলিতে সন্ধান করুন

আমি সাধারণত যে অ্যালগরিদমটি প্রয়োগ করি (বুঝতে সহজ এবং কোড) নীচে (পাইথনে):

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কেবল এই ফর্মটির বিভাজনকারীদের দিকে তাকায়।

কখনও কখনও, যদি আমি সত্যিই গতি চাই এবং পরিসরটি সীমাবদ্ধ হয় , তবে আমি ফার্মেটের সামান্য উপপাদ্যের উপর ভিত্তি করে একটি সিউডো-প্রাইম পরীক্ষাটি প্রয়োগ করি । যদি আমি সত্যিই আরও গতি চাই (যেমন ও (স্কোরিট (এন)) পুরোপুরি এ্যালগোরিদম এড়িয়ে চলি) তবে আমি মিথ্যা ধনাত্মক ( কারমাইকেল সংখ্যাগুলি দেখুন) প্রাক্টম্পিউট করি এবং একটি বাইনারি অনুসন্ধান করি। এটি এখন পর্যন্ত সবচেয়ে দ্রুতগতি সম্পন্ন পরীক্ষা যা আমি প্রয়োগ করেছি, কেবলমাত্র ব্যর্থতা হ'ল পরিসীমা সীমাবদ্ধ।


7
দুটি প্রশ্ন: আপনি কী ভেরিয়েবলগুলি iএবং কী তা আরও ভালভাবে ব্যাখ্যা করতে পারেন wএবং ফর্মটি 6k-1এবং এর অর্থ কী 6k+1? আপনার অন্তর্দৃষ্টি এবং কোড নমুনা (যা আমি বোঝার চেষ্টা করছি)
ফ্রিডম_ভেনের জন্য আপনাকে ধন্যবাদ

6
@ ফ্রিডম_বেন আপনি এখানে যান, কোওরা.com/…
অ্যালান ডং

6
এটা ভাল হবে না নিরূপণ করা sqrtএর nএকবার এবং তুলনা iগণক এটি বদলে i * iলুপ প্রতি চক্র?
পেড্রোস

3
@ ডিস্কোনি ... তবে আপনি আমাদের সাথে ভাগ করে নিতে এখানে মন্তব্য ক্ষেত্রের দ্রুততম প্রয়োগের সাথে ফিট করতে পারবেন না?
গ্রিনআসজেড

3
এটি 1 নম্বরের জন্য ব্যর্থ হয়েছে :(
দাম্জন পাভলিকা

27

আমার মতে সেরা পদ্ধতিটি হ'ল আগে যা হয়েছে তা ব্যবহার করা।

কমপক্ষে পঞ্চাশ লক্ষ পর্যন্ত প্রসারিত Nইন্টারনেটে প্রথম প্রাইমগুলির তালিকা রয়েছে । ফাইলগুলি ডাউনলোড করুন এবং সেগুলি ব্যবহার করুন, আপনি যে কোনও পদ্ধতি ব্যবহার করে আসছেন তার চেয়ে সম্ভবত এটি দ্রুততর হবে।N

আপনি যদি নিজের প্রাইম তৈরির জন্য একটি সত্যিকারের অ্যালগরিদম চান তবে উইকিপিডিয়ায় প্রাইমগুলিতে সমস্ত ধরণের ভাল জিনিস রয়েছে এখানে রয়েছে যার মধ্যে এটি করার বিভিন্ন পদ্ধতির লিঙ্ক রয়েছে এবং এখানে পরীক্ষার সম্ভাবনা-ভিত্তিক এবং দ্রুত-নির্মূল পদ্ধতি উভয়ই রয়েছে।

প্রথম বিলিয়ন (বা আরও বেশি) প্রাইমগুলি খুঁজে পেতে এবং এগুলি কোথাও নেট এ প্রকাশিত করার জন্য একত্রে চেষ্টা করা উচিত যাতে লোকেরা একই কাজটি বারবার বন্ধ করতে পারে এবং ... :-)


2
@ আহমেদবিএইচ: আকর্ষণীয়। আপনি কি এই ফাইলগুলি ডাউনলোড করার চেষ্টা করেছেন? এটি উপস্থিত নেই যে তাদের অস্তিত্ব নেই।
paxdiablo

এখনও না, আমি ভয় করি: আমার মধ্যাহ্নভোজের বিরতিতে আমি কেবল তাত্ক্ষণিকভাবে তাকিয়ে ছিলাম। এই লিঙ্কটি সম্পর্কে দূষিত কিছু হলে আমি মুছে ফেলব। সুতরাং দুঃখিত, আমার সত্যই এটি প্রথমে পরীক্ষা করা উচিত ছিল।
হামেদ

1
এই ধরনের তালিকার না বিদ্যমান। আমি এগুলি বহু বছর আগে দেখেছি কিন্তু কখনই সেগুলি ডাউনলোড করার চিন্তা করেনি। সত্য কথাটি, তারা প্রচুর জায়গা নেয় (তুলনামূলকভাবে কথা বলে), এবং যেগুলি বিক্রি করে বা বিতরণ করে এমন প্রোগ্রামগুলিতে অন্তর্ভুক্ত করা উচিত নয়। তদতিরিক্ত, এগুলি সর্বদা এবং চিরকালের জন্য অসম্পূর্ণ থাকবে। প্রোগ্রামের ব্যবহারের সময় অনুশীলনে আগত প্রতিটি সংখ্যার পরীক্ষা করা এই ধরণের আরও বেশি অর্থবোধ করে না, যতটা কম আপনার নিজের মালিকানাধীন তালিকার দৈর্ঘ্যের চেয়ে কম পরীক্ষা করা হবে। এছাড়াও, আমি মনে করি প্যাক্সটি প্রাইম অ্যালগরিদমের উদ্দেশ্য বুঝতে পারে না, বেশিরভাগ সময় প্রকৃতপক্ষে প্রাইমগুলি সন্ধান করার চেয়ে দক্ষতা / গতি পরীক্ষা করা হয়।
কোজিটোআর্গো কোজিটোসাম

2
@ কোজিটোআর্গো কোজিটোসাম, একমত যে সমস্ত প্রাইমের তালিকা চিরতরে পুরানো হয়ে যাবে যেহেতু আমি গাণিতিক প্রমাণ দেখেছি যে তারা সংখ্যায় অসীম। যাইহোক, প্রথম xপ্রাইমগুলির তালিকাটি এটি তৈরি হওয়ার পরে অসম্পূর্ণ হওয়ার সম্ভাবনা কম থাকবে :-)
প্যাক্সিডিয়াবল

1
সত্য, তবে রৈখিক ফ্যাশনে কোনও ফাইল থেকে পড়ার চেয়ে ভাল স্টোরেজ পদ্ধতি রয়েছে। আপনি যদি সত্যিই প্রাক-উত্পন্ন উত্সগুলির একটি সঞ্চিত সেট থেকে পড়তে চান তবে আরও জটিল ডেটা কাঠামো চেষ্টা করুন যা সমস্যার গতি বাড়িয়ে তোলে।
কোজিটোআর্গো কোজিটোসাম

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;
}

এটি কেবলমাত্র উপরের একেএস অ্যালগরিদমের সি ++ বাস্তবায়ন


1
এটির অন্যতম দক্ষ ডিস্ট্রিমেন্টিক অ্যালগরিদম Ive জুড়ে এসেছে, হ্যাঁ, তবে এটি একেএসের বাস্তবায়ন নয়। একেএস সিস্টেমটি উল্লিখিত অ্যালগরিদমের তুলনায় অনেক নতুন। এটি তর্কসাপেক্ষভাবে আরও দক্ষ, তবে সম্ভাব্য জ্যোতির্বিজ্ঞানের দিক থেকে বৃহত ফ্যাটোরিয়ালস / দ্বিপদী সহগের কারণে এটি বাস্তবায়ন করা কিছুটা কঠিন।
কোজিটোআর্গো কোজিটোসাম

এটি ডেরি লিহির (নন) উত্তর (জাভার পরিবর্তে সি ছাড়া অন্য ) থেকে কীভাবে আলাদা ? কিভাবে এই উত্তর দেয় What is the algorithm that produces a data structure with lowest memory consumption for the range (1, N]?
গ্রেইবার্ড

1
(N% i == 0 || n% (i + 2) == 0) কীভাবে 6n + 1 এবং 6n-1 এর সাথে মিল রয়েছে?
8:38

@ যিশওয়ানথ ভেঙ্কটেশ: 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

উইকিপিডিয়া অনুসারে, সিভি অফ ইরোটোথিনিস এর জটিলতা রয়েছে O(n * (log n) * (log log n))এবং এর O(n)মেমোরির প্রয়োজন রয়েছে - তাই আপনি যদি বিশেষত বড় সংখ্যক পরীক্ষার জন্য পরীক্ষা না করে থাকেন তবে এটি শুরু করার জন্য এটি বেশ ভাল জায়গা।


দুঃখিত আমি জানি আমার বিবরণটি অস্পষ্ট, আমি
তাকাচ্ছি

6

কেউ সিম্পি ব্যবহার করতে পারেন

import sympy

sympy.ntheory.primetest.isprime(33393939393929292929292911111111)

True

সিম্পি ডক্স থেকে প্রথম পদক্ষেপটি তুচ্ছ কারণগুলির সন্ধান করছে, যা যদি পাওয়া যায় তবে দ্রুত ফিরতে সক্ষম করে। এরপরে, যদি চালনীটি যথেষ্ট পরিমাণে বড় হয় তবে চালনিতে দ্বিখণ্ডিত অনুসন্ধান ব্যবহার করুন। স্বল্প সংখ্যার জন্য, নির্ধারক মিলার-রবিন পরীক্ষাগুলির একটি সেট এমন ঘাঁটিগুলির সাথে সঞ্চালিত হয় যা তাদের পরিসরে কোনও জবাবদিহি নেই বলে জানা যায়। অবশেষে যদি সংখ্যাটি 2 ^ 64 এর চেয়ে বড় হয় তবে একটি শক্তিশালী বিপিএসডাব্লু পরীক্ষা করা হয়। যদিও এটি একটি সম্ভাব্য প্রাথমিক পরীক্ষা এবং আমরা বিশ্বাস করি প্রতিবিম্বের উপস্থিতি রয়েছে, তবে কোনও পরিচিত কাউন্টারিক্স নেই


একটি অ্যালগরিদম হ'ল সংজ্ঞায়িত পদক্ষেপগুলির ক্রম যা কোনও সমস্যার একটি বিমূর্ত সমাধানকে সংজ্ঞায়িত করে। - উপস্থাপিত কোডের পদক্ষেপগুলির অনুমানযোগ্য ক্রম কী? এটা কি memory consumption?
গ্রেইবার্ড

2
@greybeard। সিম্পি ডক্স থেকে প্রথম পদক্ষেপটি তুচ্ছ কারণগুলির সন্ধান করছে, যা যদি পাওয়া যায় তবে দ্রুত ফিরতে সক্ষম করে। এরপরে, যদি চালনীটি যথেষ্ট পরিমাণে বড় হয় তবে চালনিতে দ্বিখণ্ডিত অনুসন্ধান ব্যবহার করুন। স্বল্প সংখ্যার জন্য, নির্ধারক মিলার-রবিন পরীক্ষাগুলির একটি সেট এমন ঘাঁটিগুলির সাথে সঞ্চালিত হয় যা তাদের পরিসরে কোনও জবাবদিহি নেই বলে জানা যায়। অবশেষে যদি সংখ্যাটি 2 ^ 64 এর চেয়ে বড় হয় তবে একটি শক্তিশালী বিপিএসডাব্লু পরীক্ষা করা হয়। যদিও এটি একটি সম্ভাব্য প্রাথমিক পরীক্ষা এবং আমরা বিশ্বাস করি প্রতিবিম্বের উপস্থিতি রয়েছে, তবে কোনও পরিচিত কাউন্টারিক্স নেই।
লেটজার উইল

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))

ব্যাখ্যা: একটি মৌলিক সংখ্যাটি এমন একটি সংখ্যা যা কেবল নিজেই বিভাজ্য হয় এবং ১. প্রাক্তন: 2,3,5,7 ...

1) যদি একটি <2: "a" 2 এর চেয়ে কম হয় তবে এটি প্রাইম নয়।

2) এলিফ এ! = 2 এবং% 2 == 0: "ক" যদি 2 দ্বারা বিভাজ্য হয় তবে এটি অবশ্যই প্রাইম নয়। তবে a = 2 যদি আমরা এটি একটি প্রাথমিক সংখ্যা হিসাবে মূল্যায়ন করতে চাই না। সুতরাং শর্তটি একটি! = 2 2

3) সমস্ত ফিরিয়ে দিন (আমার জন্য পরিসীমা একটি% i (3, int (a 0.5) +1)): ** প্রথমে দেখুন সমস্ত () কমান্ড পাইথনে কী করে। 3 থেকে শুরু করে আমরা এর স্কোয়ার রুট (একটি ** 0.5) পর্যন্ত "এ" ভাগ করি। "ক" বিভাজ্য হলে আউটপুটটি মিথ্যা হবে। বর্গমূল কেন? আসুন একটি = 16 বলুন। ১ = = ৪ এর বর্গমূল আমাদের 15 পর্যন্ত মূল্যায়ন করার দরকার নেই it's এটি কেবল প্রধান নয় বলে আমাদের কেবল 4 অবধি পরীক্ষা করে দেখতে হবে।

অতিরিক্ত: একটি ব্যাপ্তির মধ্যে সমস্ত মৌলিক সংখ্যা সন্ধানের জন্য একটি লুপ।

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

1
এটি কীভাবে ওলেকসান্ডার শ্মেহেলিউকের উত্তর থেকে আলাদা ? (উভয়ই "" পদক্ষেপ 2 "মিস করে range()...)
গ্রেইবার্ড

1
যদি একটি সংখ্যা এমনকি হয় তবে এটি প্রধান নয় (2 বাদে)। এমনকি সংখ্যার জন্যও পরীক্ষা করার দরকার নেই। আপনি যদি একটি ব্যাপ্তির মধ্যে প্রাইম নম্বর পেতে চান তবে এটি আরও দ্রুত হবে। এটি সরাসরি সংখ্যাগুলি বাদ দেবে।
গভীর গ্রেওয়াল


3

বৃহত সংখ্যার জন্য আপনি সহজেই পরীক্ষা করতে পারবেন না প্রার্থী সংখ্যা এন স্কয়ার্ট (এন) এর চেয়ে কম সংখ্যার দ্বারা বিভাজ্য কিনা তা। মিলার-রবিন প্রিমালটি টেস্টের মতো আরও অনেক স্কেলযোগ্য পরীক্ষা রয়েছে । অজগরটিতে আপনার নীচে বাস্তবায়ন রয়েছে:

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 এর মতো সুস্পষ্ট নন-প্রাইমগুলি ফিল্টার আউট করতে সহায়তা করবে।


এটি মিলার পরীক্ষা। মিলার-রবিন পরীক্ষাটি সম্ভাব্য সংস্করণ যেখানে পর্যাপ্ত আত্মবিশ্বাস না পাওয়া পর্যন্ত এলোমেলোভাবে নির্বাচিত ঘাঁটিগুলি পরীক্ষা করা হয় are এছাড়াও, মিলার পরীক্ষাটি সরাসরি রিমন হাইপোথেসিসের উপর নির্ভর করে না, তবে চতুর্ভুজীয় ডিরিকলেট চরিত্রগুলির জন্য জেনারালাইজড রিমন হাইপোথেসিস (জিআরএইচ) (আমি জানি এটি মুখের, এবং আমি এটি বুঝতে পারি না)। যার অর্থ রিমন হাইপোথিসিসের সম্ভাব্য প্রমাণ এমনকি জিআরএইচ-র ক্ষেত্রেও প্রযোজ্য নয় এবং তাই মিলার পরীক্ষাটি সঠিক প্রমাণিত করতে পারে না। এমনকি জিআরএইচকে অস্বীকার করা হলে আরও খারাপ পরিস্থিতি অবশ্যই হবে।
আর্ন ভোগেল

2

পার্টিতে দেরি হয়ে গেছে, তবে আশা করি এটি সাহায্য করবে। আপনি যদি বড় প্রাইমস খুঁজছেন তবে এটি প্রাসঙ্গিক:

বৃহত্তর বিজোড় সংখ্যার পরীক্ষা করতে আপনাকে ফার্ম্যাট-পরীক্ষা এবং / অথবা মিলার-রবিন পরীক্ষাটি ব্যবহার করতে হবে।

এই পরীক্ষাগুলিতে মডুলার এক্সপেনসেন্টেশন ব্যবহার করা হয় যা বেশ ব্যয়বহুল, nবিট এক্সপেনসিয়েনশনের জন্য আপনার কমপক্ষে nবড় মাপের গুণন প্রয়োজন এবংn বৃহত্তর আন্তঃ বিভাজন প্রয়োজন। যার অর্থ মডুলার এক্সফেনশনেশন এর জটিলতা হ'ল O (n³)।

সুতরাং বড় বন্দুকগুলি ব্যবহার করার আগে আপনার কয়েকটি কয়েকটি ট্রায়াল বিভাগ করা উচিত। তবে নিখরচায় এটি করবেন না, তাদের দ্রুত করার একটি উপায় আছে। আপনি বড় পূর্ণসংখ্যার জন্য যে শব্দ ব্যবহার করেন তার মধ্যে অনেকগুলি প্রাইম একসাথে গুণান। আপনি যদি 32 বিট শব্দ ব্যবহার করেন তবে 3 * 5 * 7 * 11 * 13 * 17 * 19 * 23 * 29 = 3234846615 এবং ইউক্লিডিয়ান অ্যালগোরিদম ব্যবহার করে আপনি যে সংখ্যাটি পরীক্ষা করেছেন তার সংখ্যার সাথে সবচেয়ে বড় সাধারণ বিভাজকটি গুণান। প্রথম পদক্ষেপের পরে সংখ্যাটি শব্দের আকারের নীচে হ্রাস করা হয় এবং সম্পূর্ণ বড় পূর্ণসংখ্যা বিভাগ না করেই অ্যালগরিদম চালিয়ে যান continue যদি জিসিডি! = 1, এর অর্থ হল আপনি একসাথে যে গুণাগুণকে গুণিত করেছেন তার মধ্যে একটির সংখ্যা ভাগ করে দেয়, সুতরাং আপনার কাছে প্রমাণ রয়েছে যে এটি প্রাথমিক নয়। তারপরে 31 * 37 * 41 * 43 * 47 = 95041567, এবং এর সাথে চালিয়ে যান।

একবার আপনি কয়েক শতাধিক (বা হাজার) প্রাইম পরীক্ষা করে ফেললে আপনি মিলার-রবিন পরীক্ষাটি 40 টি রাউন্ডে নম্বরটি প্রধান হওয়ার বিষয়টি নিশ্চিত করতে পারেন, 40 রাউন্ডের পরে আপনি নিশ্চিত হতে পারেন যে সংখ্যাটি 2% -80 এর সম্ভাবনা কেবল আছে is না (এটি সম্ভবত আপনার হার্ডওয়্যার ত্রুটিযুক্ত ...)।


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()ফাংশনটি কেবল একটি সংখ্যার বর্গমূল করছে doing

উদাহরণ স্বরূপ:

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

num % xঅংশ ফেরৎ বাকি NUM / x এর।

শেষ অবধি, এর range(2, int(sqrt(num)))অর্থ এটি একটি তালিকা তৈরি করবে যা ২ থেকে শুরু হয়ে শেষ হবেint(sqrt(num)+1)

পরিসর সম্পর্কে আরও তথ্যের জন্য, এই ওয়েবসাইটটি দেখুন !

num > 1অংশটি কেবল ভেরিয়েবলটি পরীক্ষা করছেnum 1 টির চেয়ে বড় , 1 এবং 0 টি প্রাথমিক সংখ্যা হিসাবে বিবেচনা করা হয় না তা করছে।

আমি আশা করি এটি সাহায্য করেছে :)


এটি কীভাবে the bestঅ্যালগরিদম, বা একটি ভাল এটিও যুক্তি করুন ।
গ্রেইবার্ড

@ গ্রেইবার্ড, এখানে সর্বাধিক প্রধান ফাংশনগুলি (২ ^ 31) -১ এ যায় না বা উচ্চ সংখ্যার জন্য খুব বেশি সময় নেয় তবে আমার (2 ^ 61) -1 অবধি কাজ করে, তাই আপনি পরীক্ষা করতে পারেন যে কোনও সংখ্যাটি প্রশস্ত সহ প্রাইম কিনা? সংখ্যার ব্যাপ্তি।
কেনআরআররেইডিংএই

1

পাইথনে:

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

গাণিতিক আনুষ্ঠানিকতা থেকে পাইথনকে আরও সরাসরি রূপান্তরকরণে সমস্ত (এন% পি! = 0 ...) ব্যবহৃত হবে , তবে এর জন্য পি এর সমস্ত মানগুলির কঠোর মূল্যায়ন প্রয়োজন। কোন সংস্করণ গোড়ার দিকে বন্ধ করতে পারেন একটি সত্য মান পাওয়া যায়।


Wrt "সব (ঢ% পি = 0 ...!), কিন্তু যে পি সব মূল্যবোধের কঠোর মূল্যায়ন প্রয়োজন" - যে ভুল আছে। anyএবং allউভয়ই তাড়াতাড়ি প্রস্থান করবে । প্রথমে তাই pযেখানে n % pহয় 0, allথেকে প্রস্থান করবে।
অ্যানেরয়েড

1

প্রাইম সংখ্যা জাভাস্ক্রিপ্ট জন্য সেরা অ্যালগরিদম

 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এক ভ্যালিড ইন্টারপ্রিটেশন সেরা :) প্রশ্ন হল কি পরীক্ষণ যদি একটি সংখ্যা মৌলিক জন্য শ্রেষ্ঠ অ্যালগরিদম হয়? : বিভাজনের জন্য যাচাই করা number / 2 < i < numberসুবিধাজনক কোথায় ? কি হবে number < i*i? অন্যান্য 3³ টি উত্তরগুলির বোধগম্যরা কী বলে?
গ্রেইবার্ড

1

আমাকে আপনাকে bit৪ বিট পূর্ণসংখ্যার জন্য নিখুঁত সমাধানের পরামর্শ দিই। সি # ব্যবহারের জন্য দুঃখিত। আপনি ইতিমধ্যে এটি আপনার প্রথম পোস্টে অজগর হিসাবে নির্দিষ্ট করেন নি। আমি আশা করি আপনি একটি সাধারণ মোডপাও ফাংশনটি খুঁজে পেতে পারেন এবং এটি সহজেই বিশ্লেষণ করতে পারেন।

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
}

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

লুপের জন্য আপনাকে "i <= সীমা" পরীক্ষা করার দরকার নেই, "i <সীমা" ckeck করার জন্য এটি যথেষ্ট। সুতরাং প্রতিটি পুনরাবৃত্তিতে আপনি একটি তুলনা কম করেন।
অ্যান্ড্রুশেঙ্কো আলেকজান্ডার

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
অবশ্যই কিম, এটি দেখানোর জন্য আপনাকে ধন্যবাদ .এখন থেকে স্ট্যাকওভারফ্লোতে এটি আমার প্রথম প্রোগ্রাম, আমি যথাযথ মন্তব্য এবং ব্যাখ্যা যুক্ত করব।
ডেকেবি

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
সিড্লেনে

@ সিড্লেনে আমি জানি না এটি বুলিয়ান ফিরতি ফাংশন, আমি এখনও পাইথনের প্রাথমিক এবং আমি জানি এটি নিখুঁত নয়, যাইহোক মন্তব্য করার জন্য ধন্যবাদ
প্যাট্রিক জেন

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 এর জন্য আপনাকে কেবল 50 টি নয় 10 টি পরীক্ষা করা দরকার Why কেন? বর্গক্ষেত্রের ঠিক একই সময়ে, দুটি কারণ সমান। অন্য যে কোনও ফ্যাক্টরের জন্য স্কয়ারটি (এন) এর চেয়ে কম হবে এবং অন্যটি বৃহত্তর। সুতরাং আমরা যখন sqrt (n) সহ চেকআপ করার সময়টির মধ্যে যদি না দেখে থাকি তবে আমরা এর পরে আর কোনও কিছু খুঁজে পাব না।
দানাজে

0

ও (স্কয়ার্ট (এন)) এ প্রয়োগের জন্য আমরা জাভা স্ট্রিম ব্যবহার করতে পারি; বিবেচনা করুন যে ননম্যাচ একটি শর্টসার্কিটিং পদ্ধতি যা ফলাফল নির্ধারণের জন্য অপ্রয়োজনীয় মনে করলে অপারেশনটি থামিয়ে দেয়:

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);
    }

পারফরম্যান্স ও (স্কয়ার্ট (এন)) এর কাছাকাছি হওয়া উচিত । কেউ এটি দরকারী মনে হতে পারে।


প্রার্থী রুট অন্তর্ভুক্ত করতে "পরিসীমা" "রেঞ্জক্লোজড" দিয়ে প্রতিস্থাপন করা উচিত। এছাড়াও প্রার্থী <2 কেস পরিচালনা করতে হবে।
udalmik


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

0
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;
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.