প্রাইমারিটির মডুলোর গণনা করার সবচেয়ে কার্যকর উপায় কী?


20

আপনি কি এমন কোনও অ্যালগরিদম জানেন যা মডুলাসের পরে দক্ষতার সাথে ফ্যাক্টরিয়াল গণনা করে?

উদাহরণস্বরূপ, আমি প্রোগ্রাম করতে চাই:

for(i=0; i<5; i++)
  sum += factorial(p-i) % p;

তবে, pসরাসরি ফ্যাকটোরিয়াল প্রয়োগের জন্য একটি বড় সংখ্যা (প্রধান) ।(p108)

পাইথনে, এই কাজটি সত্যিই সহজ তবে আমি কীভাবে অনুকূল করব তা জানতে চাই।


6
সমস্যার মতো মনে হচ্ছে আপনি উইলসনের উপপাদ্যটি ব্যবহার করতে চান। প্রাইম , । সুতরাং কোনও প্রোগ্রামিং ভাষা ব্যবহার না করেই উত্তরটি । সম্ভবত আপনি আপনার সমস্যা সাধারণ করতে চান? p100(p1)!=1modp100
আর্যভাটা

5
আপনি কি আরও স্পষ্টভাবে সমস্যাটি বলতে পারবেন? আপনি কি গণনা করতে চান (X!) (mod (X+1)), বা আরও সাধারণ (X!) (mod Y)? এবং আমি অনুমান করি যে এর factorial(100!)সত্যিকারের অর্থ এই নয় যে আপনি দুবার ফ্যাক্টরিয়াল ফাংশন প্রয়োগ করতে চান।
কিথ থমসন

1
আপনার কাছে উইলসনের উপপাদ্য না থাকলেও আপনার কাছে যা কমপক্ষে ওভারফ্লো সমস্যাগুলি এড়াতে সহায়তা করবে। (mn)modp=(mmodp)(nmodp)
ডেভ ক্লার্ক

8
দ্রষ্টব্য যে উইলসনের উপপাদ্য তখনই প্রযোজ্য যখন p প্রধান হয়। আপনার প্রশ্নটি উল্লেখ করে না যে p প্রধান, সুতরাং আপনি যা লিখেছেন তা সঠিক নয়।
ডেভ ক্লার্ক

উত্তর:


11

(এই উত্তরটি প্রথমে প্রশ্নের ভিতরে প্রশ্নকর্তা জোনাপ্রিয়েটো পোস্ট করেছিলেন।)

আমি উইলসনের উপপাদ্যটি মনে করেছি এবং আমি ছোট ছোট জিনিসগুলি লক্ষ্য করেছি:

উপরের প্রোগ্রামে, আমি যদি লিখি তবে এটি আরও ভাল:

(p1)!1(modp)(p2)!(p1)!(p1)11(modp)(p3)!(p2)!(p2)1(p2)1(modp)(p4)!(p3)!(p3)1(p2)1(p3)1(modp) (p5)!(p4)!(p4)1(p2)1(p3)1(p4)1(modp)

আর তুমি জানতে পারেন কারণ , তাই সঙ্গে বর্ধিত Euclidian অ্যালগরিদম আপনি মান জানতে পারেন , যে হয় বিপরীত মডুলাস।(pi)1gcd(p,pi)=1(pi)1

আপনি একই সমাহারগুলিও দেখতে পারেন, যেমন: সুতরাং, যোগফল সমান: এবং যদি আপনি শুরুতে ফ্যাক্টরিয়ালগুলি ফ্যাক্টরিয়ালগুলি নির্ধারণ করেন তবে আপনি এবং, ভয়েলা, বিপরীতমুখী মডুলাসটি ফ্যাক্টরিয়ালগুলির চেয়ে বেশি দক্ষ।

(p5)!(p24)1(modp)(p4)!(p+6)1(modp)(p3)!(p2)1(modp)(p2)!1(modp)(p1)!1(modp)
(24)1+(6)1+(2)1
8(24)1(modp)

তাই মূলত । ঝরঝরে! (pk)!(p+(k1)!(1)k)1(modp)
টমাস আহলে

দুঃখিত তবে আমি যখন করি তখন আমি পাই:(24)1+61+(2)1
9(24)1=38

1

আপনি যে উদাহরণ পোস্ট করছেন এটি ইউরারের সমস্যা # 381 এর সাথে খুব ঘনিষ্ঠভাবে সম্পর্কিত। সুতরাং আমি এমন একটি উত্তর পোস্ট করব যা এলারের সমস্যা সমাধান করে না। আমি পোস্ট করব কিভাবে আপনি মৌলিক হিসাবে মৌলিক হিসাব করতে পারেন।

সুতরাং: এন গণনা কিভাবে! মডুলো পি?

দ্রুত পর্যবেক্ষণ: যদি n ≥ p হয়, তবে n! একটি ফ্যাক্টর পি আছে, সুতরাং ফলাফল 0 খুব দ্রুত। এবং যদি আমরা সেই প্রয়োজনীয়তাটিকে অগ্রাহ্য করি যে পি একটি প্রধান হওয়া উচিত তবে কি পি এর সবচেয়ে ক্ষুদ্রতম মৌলিক ফ্যাক্টর হওয়া উচিত, এবং এন! modulo p 0 হয় যদি n ≥ q হয়। আপনার প্রশ্নের উত্তর দেওয়ার জন্য পি প্রয়োজনীয় যে প্রধান কারণ তা করার খুব বেশি কারণ নেই।

এখন আপনার উদাহরণে (এন - আই)! 1 ≤ i ≤ 5 জন্য এসেছিল। আপনাকে পাঁচটি ফ্যাকটোরিয়াল গণনা করতে হবে না: আপনি গণনা করুন (এন - 5) !, (এন - 4) দিয়ে গুন করুন (এন - 4) পেতে, (এন - 3) পেতে গুণ (এন - 3)! ইত্যাদি। এটি কাজটি প্রায় একটি ফ্যাক্টর দ্বারা হ্রাস করে 5. সমস্যাটি আক্ষরিকভাবে সমাধান করবেন না।

প্রশ্ন হল এন কিভাবে গণনা করা যায়! মডুলো মি। সুস্পষ্ট উপায় হ'ল এন !, মোটামুটি এন লগ এন দশমিক অঙ্ক সহ একটি সংখ্যা গণনা করা এবং বাকী মডুলো পি গণনা করা। এটা কঠোর পরিশ্রম। প্রশ্ন: আমরা কীভাবে এই ফলাফলটি দ্রুত পেতে পারি? সুস্পষ্ট কাজ না করে।

আমরা জানি ((a * b * c) modulo p = (((a * b) modulo p) * c) modulo p।

এন গণনা করতে, আমরা সাধারণত x = 1 দিয়ে শুরু করব, তারপরে x কে 1, 2, 3, ... দ্বারা গুণ করব ly মডিউল সূত্র ব্যবহার করে আমরা গণনা করি এন! x = 1 দিয়ে শুরু করে, এবং তারপরে i = 1, 2, 3, .., n এর জন্য n গণনা ছাড়াই মডুলো পি, এবং x এর পরিবর্তে (x * i) মডিউল পি।

আমাদের সর্বদা x <p এবং i <n থাকে, সুতরাং আমাদের কেবল x * পি গণনা করার জন্য পর্যাপ্ত নির্ভুলতা প্রয়োজন, এন গণনা করার চেয়ে বেশি উচ্চ নির্ভুলতা নয়! সুতরাং এন গণনা! পি ≥ 2 এর জন্য মডুলো পি আমরা নিম্নলিখিত পদক্ষেপগুলি নিই:

Step 1: Find the smallest prime factor q of p. If n ≥ q then the result is 0.
Step 2: Let x = 1, then for 1 ≤ i ≤ n replace x with (x * i) modulo p, and x is the result. 

(কিছু উত্তরে উইলসনের উপপাদ্য উল্লেখ করা হয়েছে, যা প্রদত্ত উদাহরণের খুব বিশেষ ক্ষেত্রে শুধুমাত্র প্রশ্নের উত্তর দেয়, এবং এলিউর সমস্যা # 381 সমাধানে খুব কার্যকর, তবে সাধারণভাবে জিজ্ঞাসা করা প্রশ্নটি সমাধান করতে কার্যকর হয় না)।


-1

এটি আমার উইলসনের উপপাদ্যটি প্রয়োগের ব্যবহার:

যখন মোড-এন এর বিপরীতে সামান্য থাকে তখন ফ্যাক্টমোড ফাংশনটি হ'ল মোড (এন!)% এমডি গণনা করার জন্য।

কেস যখন অন্য কোনও কার্যকর পদ্ধতির বিষয়টি জানেন না যখন এটি কেস না হয় (যেমন: এন = 1e6 এবং এমওডি = 1e9 + 7)?

ll powmod(ll a, ll b){//a^b % MOD
  ll x=1,y=a;
  while(b){
    if(b&1){
      x*=y; if(x>=MOD)x%=MOD;
    }
    y*=y; if(y>=MOD)y%=MOD;
    b>>=1;
  }
  return x;
} 
ll InverseEuler(ll n){//modular inverse of n
  return powmod(n,MOD-2);
}
ll factMOD(ll n){ //n! % MOD efficient when MOD-n<n
   ll res=1,i;
   for(i=1; i<MOD-n; i++){
     res*=i;
     if(res>=MOD)res%=MOD;
   }
   res=InverseEuler(res);   
    if(!(n&1))
      res= -res +MOD;
  }
  return res%MOD;
}

1
কোডটি এখানে আসলে বিষয়বস্তু নয়। অ্যালগরিদমের বিবরণ অনেক বেশি দরকারী কারণ এর জন্য আপনার কোডটি লেখার যে ভাষাটি আপনি ঠিক করেছেন তা লোকেদের বোঝার দরকার নেই এবং কারণ বাস্তবিক প্রয়োগগুলি প্রায়শই এমনভাবে অনুকূলিত হয় যা তাদের বোঝা আরও শক্ত করে তোলে। এবং দয়া করে আপনার উত্তরগুলির চেয়ে পৃথক প্রশ্ন হিসাবে আপনার প্রশ্নগুলি জিজ্ঞাসা করুন। স্ট্যাক এক্সচেঞ্জ একটি প্রশ্নোত্তর সাইট, কোনও আলোচনার বোর্ড নয় এবং প্রশ্নগুলি উত্তরগুলির মধ্যে লুকিয়ে রয়েছে কিনা তা খুঁজে পাওয়া শক্ত। ধন্যবাদ!
ডেভিড রিচার্বি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.