2010-08-03 17 views
6

में फर्मेट का छोटा प्रमेय मैंने जावास्क्रिप्ट में फर्मेट के छोटे प्रमेय को लागू करने की कोशिश की। मैंने इसे दोनों तरीकों से आजमाया, एक^(पी -1) मॉड पी = 1 और एक^पी मॉड पी = एक मॉड पी।जेएस

function fermat(a, p) { 
    return (((a^(p - 1)) % p) === 1); 
} 

और

function fermat(a, p) { 
    return ((a^p) % p) === (a % p); 
} 

यह दोनों तरीकों से काम नहीं करता है, तो उस ठीक करने के लिए किसी भी तरह से है?

उत्तर

9

उपयोग करने के लिए इसका मतलब है ^XOR की जरूरत है। exponentiation के लिए आपको Math.pow(x, y) की आवश्यकता है।

function fermat(a, p) { 
    return Math.pow(a, p - 1) % p === 1; 
} 
7
^के बजाय

, आप जावास्क्रिप्ट में Math.pow

2

जावास्क्रिप्ट में, कैरेट (^) एक्सओआर ऑपरेटर है। आप जो उपयोग करना चाहते हैं वह Math.pow (x, y) फ़ंक्शन है जो x^y के बराबर है।

3

के अलावा^बनाम Math.pow() मुद्दा अन्य लोगों ने बताया है, अगले बाधा आप करेंगे संभावना चेहरा जावास्क्रिप्ट की सीमित परिशुद्धता में निर्मित सांख्यिक प्रकार है। एक्सपोनेंट बड़े होने के बाद आप चाहते हैं, तो आप प्रीमिटी टेस्ट के रूप में इस तरह के दिनचर्या का उपयोग करने के लिए चाहते हैं, तो आप बहुत सटीक रूप से प्रतिनिधित्व करने योग्य जावास्क्रिप्ट संख्याओं की सीमा से बहुत जल्दी हो जाएंगे। आप को जावास्क्रिप्ट बिग्नम लाइब्रेरी (उदाहरण के लिए, this one) में देखना चाहते हैं जो एक्सपोनेंटिएशन और मनमाने ढंग से बड़े पूर्णांक के लिए मॉड्यूलस का समर्थन करता है।

+0

हाँ, मुझे पता है कि। मैंने पहले ही जावा में फर्मेट के छोटे प्रमेय को कार्यान्वित किया है और बहुत तेज प्रतिक्रिया मिली है, लेकिन जब मैंने 10k तक सभी प्राइम प्राप्त करने की कोशिश की, तो मैं सीमा से बाहर हो गया। लेकिन यह सिर्फ jsperf (http://jsperf.com/prime-numbers/4) पर एक परीक्षण के लिए है, और यह कैश का उपयोग करके कुछ समाधानों के रूप में लगभग तेज़ प्रदर्शन करता है (आधे मिलियन ऑपरेशन-लूप के लिए)। मैं उस परिणाम के साथ ठीक हूँ ... – fb55