মিলার-রবিন শক্তিশালী সিউডোপ্রিমেস


16

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

এটি OEIS ক্রম A014233

পরীক্ষার কেস (এক সূচকযুক্ত)

1       2047
2       1373653
3       25326001
4       3215031751
5       2152302898747
6       3474749660383
7       341550071728321
8       341550071728321
9       3825123056546413051
10      3825123056546413051
11      3825123056546413051
12      318665857834031151167461
13      3317044064679887385961981

পরীক্ষাগুলির কেসগুলি N > 13উপলভ্য নয় কারণ সেগুলি মানগুলি এখনও পাওয়া যায় নি। আপনি যদি ক্রমানুসারে পরবর্তী শব্দ (গুলি) সন্ধান করতে পরিচালনা করেন তবে এটি / সেগুলি ওইআইএস-এ জমা দিতে ভুলবেন না!

বিধি

  • আপনি Nশূন্য-সূচকযুক্ত বা এক-সূচকযুক্ত মান হিসাবে বেছে নিতে পারেন ।
  • এটি আপনার ভাষার পূর্ণসংখ্যার পরিসীমা (যেমন N = 12স্বাক্ষরিত 64৪-বিট পূর্ণসংখ্যার জন্য উপযুক্ত) কেবলমাত্র তার সমাধানের জন্য আপনার সমাধানের জন্য গ্রহণযোগ্য , তবে আপনার সমাধানটি তাত্ত্বিকভাবে কোনও অনুমানের জন্য অনুমান সহ যে কোনও ইনপুট জন্য কাজ করতে পারে যে আপনার ভাষা স্বেচ্ছাসেদী পূর্ণসংখ্যার সমর্থন করে।

পটভূমি

যে কোনও ধনাত্মক এমনকি পূর্ণসংখ্যার xআকারটি x = d*2^sযেখানে dবিজোড় সেখানে লেখা যেতে পারে । dএবং sবার বার n2 দ্বারা বিভাজক দ্বারা গুণ করা যেতে পারে যতক্ষণ না ভাগফল আর 2 দ্বারা বিভাজ্য হয় না dএটি চূড়ান্ত ভাগফল, এবং s2 বিভক্তের সংখ্যা n

যদি ধনাত্মক পূর্ণসংখ্যার সংখ্যাটিn প্রধান হয় তবে ফার্মাসের সামান্য উপপাদ্যটি বলে:

ফার্মার

কোন সসীম ক্ষেত্র Z/pZ (যেখানে pকিছু মৌলিক), একমাত্র বর্গমূল 1হয় 1এবং -1(অথবা এবং, equivalently, 1এবং p-1)।

নিম্নলিখিত দুটি বক্তব্যগুলির মধ্যে একটি অবশ্যই একটি প্রধানের n(যেখানে d*2^s = n-1এবং rকিছুটা পূর্ণসংখ্যার মধ্যে [0, s)) অবশ্যই প্রমাণ করতে আমরা এই তিনটি সত্য ব্যবহার করতে পারি :

মিলার-রবিনের অবস্থা

মিলার-রবিন primality পরীক্ষা উপরে দাবির contrapositive পরীক্ষার দ্বারা পরিচালনা: যদি সেখানে একটি বেস হয় aযেমন যে উপরে অবস্থার উভয় মিথ্যা, তারপর nপ্রধানমন্ত্রী নয়। সেই বেসকে সাক্ষীa বলা হয় ।

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

যদি অপর্যাপ্ত সংখ্যক প্রাথমিক ঘাঁটি পরীক্ষা করা হয় তবে পরীক্ষাটি মিথ্যা ইতিবাচক - বিজোড় সংমিশ্রণ পূর্ণসংখ্যার উত্পাদন করতে পারে যেখানে পরীক্ষাটি তাদের সম্মিলন প্রমাণ করতে ব্যর্থ হয়। বিশেষত, যদি কোনও বেস aএকটি বিজোড় সংখ্যার সংমিশ্রণ প্রমাণ করতে ব্যর্থ হয়, তবে সেই সংখ্যাটিকে বেসকে একটি শক্ত সিউডোপ্রাইম বলা হয় a। এই চ্যালেঞ্জ বিজোড় যৌগিক সংখ্যা যারা কম সব ঘাঁটি থেকে শক্তিশালী psuedoprimes হয় বা সমান খোঁজার সম্পর্কে Nতম মৌলিক সংখ্যা (যা বলার অপেক্ষা রাখে না যে, তারা সব থেকে শক্তিশালী pseudoprimes হয় সমতূল্য প্রধানমন্ত্রী ঘাঁটি কম বা সমান Nতম মৌলিক সংখ্যা) ।


1
স্যান্ডবক্স পোস্ট (এখন মুছে ফেলা হয়েছে)
মেগো

একটি অ্যালগরিদম যা নিয়ম দ্বারা অনুমোদিত শক্তিশালী সিউডো-আদিমতার জন্য ফলাফল 1 থেকে সমস্ত অদ্ভুত মান পরীক্ষা করে?
ব্যবহারকারী 202729

@ user202729 কেন হবে না তা আমি দেখতে পাচ্ছি না। আপনি এটি কি মনে করিবে?
মেগো

আমি এটিকে দ্রুততম-কোড প্রশ্ন করার পরামর্শ দেব কারণ বেশিরভাগ উত্তর কেবল নিখরচায় বল প্রয়োগ করা হবে।
নীল এ।

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

উত্তর:


4

সি, 349 295 277 267 255 বাইট

N,i;__int128 n=2,b,o,l[999];P(m){i<N&&P(m<2?l[i++]=n:n%m?m-1:n++);}main(r){for(P(scanf("%d",&N));r|!b;)for(++n,b=i=N;i--&&b;){for(b=n-1,r=0;~b&1;b/=2)++r;for(o=1;b--;o=o*l[i]%n);for(b=o==1;r--;o=o*o%n)b|=o>n-2;for(o=r=1;++o<n;r&=n%o>0);}printf("%llu",n);}

স্টিডিনে 1-ভিত্তিক ইনপুট নেয়, যেমন:

echo "1" | ./millerRabin

এটি অবশ্যই খুব শীঘ্রই যে কোনও সময় ক্রমের কোনও নতুন মান আবিষ্কার করতে যাচ্ছে না, তবে এটি কাজটি সম্পন্ন করে। আপডেট: এখন আরও ধীর!

  • সামান্য দ্রুততর এবং খাটো, নিল ক-এর উত্তর থেকে অনুপ্রেরণা সঙ্গে ( a^(d*2^r) == (a^d)^(2^r))
  • এই চ্যালেঞ্জের সমস্ত সমাধান বিজোড় হবে তা বুঝতে পেরে আবার উল্লেখযোগ্যভাবে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে চলতে হবে।
  • এখন জিসিসি ব্যবহার করুন __int128, যা unsigned long longবৃহত্তর সংখ্যার সাথে কাজ করার চেয়েও খাটো ! লিটল-এন্ডিয়ান মেশিনগুলিতে, প্রিন্টফ %lluএখনও দুর্দান্ত কাজ করে।

কম minified

N,i;
__int128 n=2,b,o,l[999];
P(m){i<N&&P(m<2?l[i++]=n:n%m?m-1:n++);}
main(r){
    for(P(scanf("%d",&N));r|!b;)
        for(++n,b=i=N;i--&&b;){
            for(b=n-1,r=0;~b&1;b/=2)++r;
            for(o=1;b--;o=o*l[i]%n);
            for(b=o==1;r--;o=o*o%n)b|=o>n-2;
            for(o=r=1;++o<n;r&=n%o>0);
        }
    printf("%llu",n);
}

(পুরানো) ব্রেকডাউন

unsigned long long                  // Use the longest type available
n=2,N,b,i,d,p,o,                    // Globals (mostly share names with question)
l[999];                             // Primes to check (limited to 999, but if you
                                    // want it to be "unlimited", change to -1u)
m(){for(o=1;p--;o=o*l[i]%n);}       // Inefficiently calculates (l[i]^p) mod n

// I cannot possibly take credit for this amazing prime finder;
// See /codegolf//a/5818/8927
P(m){i<N&&P(m<2?l[i++]=n:n%m?m-1:n++);}

main(r){
    for(
        P(scanf("%llu",&N));        // Read & calculate desired number of primes
        r|!b;){                     // While we haven't got an answer:
        n=n+1|1;                    // Advance to next odd number
        for(b=1,i=N;i--&&b;){       // For each prime...
            for(d=n-1,r=0;~d&1;d/=2)++r; // Calculate d and r: d*2^r = n-1
            // Check if there exists any r such that a^(d*2^r) == -1 mod n
            // OR a^d == 1 mod n
            m(p=d);
            for(b=o==1;r--;b|=o==n-1)m(p=d<<r);
            // If neither of these exist, we have proven n is not prime,
            // and the outer loop will keep going (!b)
        }
        // Check if n is actually prime;
        // if it is, the outer loop will keep going (r)
        for(i=r=1;++i<n;r&=n%i!=0);
    }
    printf("%llu",n);               // We found a non-prime; print it & stop.
}

উল্লিখিত হিসাবে, এটি 1-ভিত্তিক ইনপুট ব্যবহার করে। তবে এন = 0 এর জন্য এটি 9 উত্পাদন করে যা সম্পর্কিত ক্রমটি https://oeis.org/A006945 অনুসরণ করে । আর না; এখন এটি 0 এ ঝুলছে।

সকল এন এর জন্য কাজ করা উচিত (কমপক্ষে আউটপুট 2 ^ 64 না পৌঁছানো পর্যন্ত) তবে অবিশ্বাস্যরকম ধীর হয়ে যায়। আমি এটি এন = 0, এন = 1 এবং ( অনেক অপেক্ষার পরে ), এন = 2 এ যাচাই করেছি ।


আমি আমার সমাধানের উপর একটি অগ্রগতি তৈরি করেছি, এবং তারপরে আপনি আমাকে কেবল ওয়ান আপ করুন ... ভাল লাগল!
নীল এ।

@NeilA। দুঃখিত! আপনি আপনার আপডেট পোস্ট করার আগে আমি সংক্ষিপ্ত ইন টাইপের সাথে খেলছিলাম। আমি নিশ্চিত আপনি কোথাও 2 বাইট পাবেন; এটি 2 টি ভিন্ন নন-গল্ফিং ভাষা বিবেচনা করে আশ্চর্যজনকভাবে প্রতিযোগিতামূলক হয়ে উঠেছে: ডি
ডেভ

3

পাইথন 2, 633 465 435 292 282 275 256 247 বাইট

0-ইন্ডেক্স

আপনার বাস্তবায়নের বিষয়ে প্রশ্ন করুন এবং নতুন কিছু চেষ্টা করুন

একটি ফাংশন থেকে কোনও প্রোগ্রামে রূপান্তর করা কিছুটা বাইটকে কোনওরকম সংরক্ষণ করে ...

পাইথন 2 যদি আমাকে একই জিনিসটি করার জন্য একটি ছোট্ট উপায় দেয় তবে আমি পাইথন ২ ব্যবহার করতে যাচ্ছি Division বিভাগটি ডিফল্ট সংখ্যায় হয়, সুতরাং 2 দিয়ে ভাগ করার একটি সহজ উপায়, এবং printবন্ধনীগুলির প্রয়োজন হয় না।

n=input()
f=i=3
z={2}
a=lambda:min([i%k for k in range(2,i)])
while n:
 if a():z|={i};n-=1
 i+=2
while f:
 i+=2;d,s,f=~-i,0,a()
 while~d&1:d/=2;s+=1
 for y in z:
  x=y**d%i
  if x-1:
   for _ in[]*s:
    x*=x
    if~x%i<1:break
   else:f=1
print i

এটি অনলাইন চেষ্টা করুন!

পাইথন অন্যান্য ভাষার তুলনায় কুখ্যাত ধীর is

নিখুঁত নির্ভুলতার জন্য একটি পরীক্ষার বিভাগ পরীক্ষা সংজ্ঞা দেয়, তারপরে সিউডোপ্রাইম না পাওয়া পর্যন্ত মিলার-রবিন পরীক্ষাটি বারবার প্রয়োগ করে।

এটি অনলাইন চেষ্টা করুন!

সম্পাদনা : অবশেষে উত্তরটি গল্ফ করেছিল

সম্পাদনা : minপরীক্ষার বিভাগের প্রাথমিকতা পরীক্ষার জন্য ব্যবহৃত হয় এবং এটিকে পরিবর্তিত করেlambda । কম দক্ষ, তবে খাটো। এছাড়াও নিজেকে সহায়তা করতে পারেনি এবং কয়েক বিটওয়াইজ অপারেটর ব্যবহার করেছেন (দৈর্ঘ্যের কোনও পার্থক্য নেই)। তত্ত্বগতভাবে এটি দ্রুত (সামান্য) কাজ করা উচিত।

সম্পাদনা : ধন্যবাদ @ ডেভ আমার সম্পাদক আমাকে ট্রোল করেছেন। আমি ভেবেছিলাম আমি ট্যাব ব্যবহার করছি তবে এটি পরিবর্তে 4 টি স্পেসে রূপান্তরিত হচ্ছে। এছাড়াও প্রতিটি একক পাইথন টিপ ব্যবহার করে তা প্রয়োগ করে।

সম্পাদনা : 0-ইনডেক্সিংয়ে স্যুইচ করা, আমাকে প্রাইমগুলি উত্পন্ন করার সাথে কয়েকটা বাইট সংরক্ষণ করতে দেয়। কয়েক তুলনা পুনর্বিবেচনা

সম্পাদনা : for/elseস্টেটমেন্টের পরিবর্তে পরীক্ষার ফলাফল সংরক্ষণ করতে একটি ভেরিয়েবল ব্যবহার করা হয় ।

সম্পাদনা : lambdaপ্যারামিটারের প্রয়োজনীয়তা অপসারণ করতে ফাংশনের অভ্যন্তরে স্থানান্তরিত ।

সম্পাদনা : বাইটস সংরক্ষণের জন্য একটি প্রোগ্রামে রূপান্তরিত

সম্পাদনা : পাইথন 2 আমাকে বাইটস বাঁচায়! এছাড়াও আমাকে ইনপুটটি রূপান্তর করতে হবে নাint


আপনি যেভাবে পরিচালনা করেছেন তার জন্য +1 a^(d*2^r) mod n!
ডেভ

আপনি কি অবগত আছেন যে আপনি পাইথনে একক স্পেস (বা একক-ট্যাব) ইনডেন্টেশন ব্যবহার করতে পারেন ... পুরো প্রচুর বাইট সংরক্ষণ করতে
ডেভ

@ ডেভ: এটি প্রতি ইন্ডেন্টেশন স্তরের 1 টি ট্যাব ব্যবহার করছে
নীল এ।

আমি মনে করি যে আপনার আইডিই আপনার সাথে জগাখিচুবি করছে এবং আপনাকে ট্যাবগুলি ব্যবহার করার সময় স্পেসগুলি সংরক্ষণ করছে; আমি যখন তাদের একক স্পেসের জন্য প্রতিস্থাপন করি তখন আমি কেবল 311 বাইটের বাইট গণনা পাই! এটি অনলাইন চেষ্টা করুন!
ডেভ

@ ডেভ: ঠিক আছে, এটি অদ্ভুত, ধন্যবাদ, আমি উত্তরটি আপডেট করব।
নীল এ।

2

পার্ল + ম্যাথ :: প্রাইম :: ইউটিল, 81 + 27 = 108 বাইট

1 until!is_provable_prime(++$\)&&is_strong_pseudoprime($\,2..nth_prime($_));$_=""

-lpMMath::Prime::Util=:all(27-বাইট পেনাল্টি, আউট) দিয়ে চালান ।

ব্যাখ্যা

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

আমরা ধারাবাহিক পূর্ণসংখ্যার মধ্য দিয়ে চলি যতক্ষণ না আমরা এমন একটি খুঁজে পাই যা প্রধান নয়, এবং এখনও 2 থেকে এন থাইম পর্যন্ত সমস্ত পূর্ণসংখ্য বেসগুলিতে একটি শক্ত সিউডোপ্রিম । কমান্ড-লাইন বিকল্পটি এমন লাইব্রেরি আমদানি করে যা Math::Prime::Utilবিল্টিনকে প্রশ্নযুক্ত রয়েছে এবং অন্তর্নিহিত ইনপুটও সেট করে (লাইনে-এ-এ-টাইমে; এর নিজস্ব বিল্টইন বিগাইন লাইব্রেরি রয়েছে যা এর পূর্ণসংখ্যার মধ্যে নতুন লাইনের পছন্দ করে না)। এটি ব্যবহারের স্ট্যান্ডার্ড পার্ল ট্রিক ব্যবহার করে$\বিশ্রী পার্সগুলি হ্রাস করতে এবং আউটপুটকে সুস্পষ্টভাবে উত্পন্ন করার অনুমতি দেওয়ার জন্য এটি (আউটপুট লাইন বিভাজক) ।

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

পার্ল + ম্যাথ :: প্রাইম :: ইউটিলি, 71 + 17 = 88 বাইট, @ দাদার সহযোগিতায়

1until!is_provable_prime(++$\)&is_strong_pseudoprime$\,2..n‌​th_prime$_}{

-lpMntheory=:all(17 বাইট পেনাল্টি) দিয়ে চালান ।

এটি কয়েকটি পার্ল গল্ফিং ট্রিকস ব্যবহার করে যা আমি হয় জানি না (স্পষ্টতই ম্যাথ :: প্রাইম :: ইউটিলের একটি সংক্ষিপ্তসার আছে!), সম্পর্কে জানতাম তবে ( প্রতিটি রেখাকে স্পষ্টভাবে নয় বরং একবার স্পষ্টভাবে }{আউটপুট আউটপুট আউট ) ব্যবহার করার কথা ভাবেনি , বা সম্পর্কে জানতেন তবে কোনওভাবেই ভুলভাবে প্রয়োগ করতে সক্ষম হলেন (ফাংশন কলগুলি থেকে প্রথম বন্ধনী সরিয়ে)। এগুলি আমার দিকে নির্দেশ করার জন্য @ দাদাকে ধন্যবাদ। তা ছাড়া এটি অভিন্ন।$\"$_$\"


অবশ্যই একটি গল্ফ-ইশ ভাষা এসে বাকিদের মারধর করে। সাবাশ!
নীল এ।

আপনি ntheoryপরিবর্তে ব্যবহার করতে পারেন Math::Prime::Util। এছাড়াও, }{পরিবর্তে ভাল হতে ;$_=""হবে। এবং আপনি 1কিছু ফাংশন কলগুলির পরে স্থান এবং প্রথম বন্ধনীটি বাদ দিতে পারেন । এছাড়াও, &পরিবর্তে কাজ করে &&perl -Mntheory=:all -lpe '1until!is_provable_prime(++$\)&is_strong_pseudoprime$\,2..nth_prime$_}{'
দাদা

আমি সম্পূর্ণরূপে ভুলে যেতে চাই }{। (আশ্চর্যের বিষয়, আমি প্রথম বন্ধনীটির কথা মনে রেখেছিলাম তবে পার্লের মধ্যে গল্ফ করলাম এবং এটি ছেড়ে দেওয়ার নিয়মগুলি মনে করতে পারিনি।) ntheoryযদিও সংক্ষিপ্তসারটি সম্পর্কে আমি মোটেই জানতাম না ।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.