2011-09-20 6 views
12

क्या कोई ऐसा फ़ंक्शन है जो मुझे मॉड्यूलर उलटा (मॉड एन) की गणना करने की अनुमति देगा? उदा। 1 9^-1 = 11 (मॉड 30), इस मामले में 1 9^-1 == -11 == 1 9;सी # मॉडइवर्स फ़ंक्शन

+0

ध्यान दें कि आप मनमाने ढंग से गुणा पलट सकता है। उदाहरण के लिए 2 में गुणात्मक उलटा मॉड्यूलो 30 है क्योंकि जीसीडी (2,30)! = 1 – CodesInChaos

उत्तर

0

मॉड्यूलर अंकगणितीय का समर्थन करने के लिए सी # में कुछ भी नहीं बनाया गया है। आपको लाइब्रेरी खोजने के लिए इसे स्वयं लागू करना होगा, या बेहतर होगा।

+0

किस प्रकार की लाइब्रेरी है? – Nook

+3

@Nook: er ... ए सी # पुस्तकालय? –

+0

मॉड्यूलर अंकगणितीय के लिए एक पुस्तकालय। –

2

BouncyCastle क्रिप्टो लाइब्रेरी में बिगइंटर क्रियान्वयन है जिसमें अधिकांश मॉड्यूलर अंकगणितीय कार्य हैं। यह Org.BouncyCastle.Math नेमस्पेस में है।

12

के बाद से नेट 4.0+ एक विशेष मॉड्युलर गणित के साथ BigInteger लागू करता ढंग से काम ModPow (जो पैदा करता है "X बिजली Y सापेक्ष Z"), आप ModInverse अनुकरण करने के लिए एक तीसरे पक्ष के पुस्तकालय की जरूरत नहीं है। , विकिपीडिया में देखो

a_inverse = BigInteger.ModPow(a, n - 2, n) 

अधिक जानकारी के लिए:: अगर n एक प्रमुख है, तुम सब करने की जरूरत है की गणना करने के लिए है Modular multiplicative inverse, खंड Using Euler's theorem, विशेष मामला "जब मीटर एक प्रमुख है।" वैसे, इस पर एक और हालिया SO विषय है: 1/BigInteger in c#, उसी दृष्टिकोण के साथ suggested by CodesInChaos

+5

कृपया ध्यान दें कि यह विशेष मामला है, * जब एम एक प्राइम * है। –

5
int modInverse(int a, int n) 
{ 
    int i = n, v = 0, d = 1; 
    while (a>0) { 
     int t = i/a, x = a; 
     a = i % x; 
     i = x; 
     x = d; 
     d = v - t*x; 
     v = x; 
    } 
    v %= n; 
    if (v<0) v = (v+n)%n; 
    return v; 
} 
+0

काम करने लगता है, लेकिन यह अच्छा होगा अगर यह संकेत हो सकता है (उदाहरण के लिए अपवाद फेंक कर) अगर उलटा असंभव है ('ए 'अवांछित मॉड्यूलो' एन' नहीं है) जो तब होता है जब 'ए' और' एन 'शेयर करता है गैर-तुच्छ कारक (उनकी जीसीडी एक से अधिक है)। –

1
BigInteger modInverse(BigInteger a, BigInteger n) 
     { 
      BigInteger i = n, v = 0, d = 1; 
      while (a > 0) 
      { 
       BigInteger t = i/a, x = a; 
       a = i % x; 
       i = x; 
       x = d; 
       d = v - t * x; 
       v = x; 
      } 
      v %= n; 
      if (v < 0) v = (v + n) % n; 
      return v; 
     } 
+4

बिगइंटर द्वारा प्रतिस्थापित किए गए सैमल्स के उत्तर की एक (खराब प्रारूपित) प्रति होने के लिए डाउनवॉटेड। –

संबंधित मुद्दे