2010-07-21 14 views
45

संभव डुप्लिकेट:
How to determine if a number is a prime with regex?इस रेगेक्स को प्राइम्स कैसे मिलते हैं?

This page दावा है कि यह नियमित अभिव्यक्ति को पता चलता है गैर रूढ़ अंक (और जवाबी उदाहरण के द्वारा: अभाज्य संख्या):

/^1?$|^(11+?)\1+$/ 

कैसे यह प्राइम्स पाता है?

+8

यह ** ** एक डुप्लिकेट नहीं है। यह एक अलग regexp और एक अलग तकनीक है, और बूट करने के लिए बेहतर जवाब है। – bmargulies

+0

@bmargulies: यह * एक डुप्ली है। रेगेक्स वही है, इस प्रश्न पर इनपुट प्रतिबंधों को देखते हुए और जावा की स्ट्रिंग.मैट्स विधि पूरी स्ट्रिंग के खिलाफ रेगेक्स से मेल खाती है (इसलिए^और $ अंतर्निहित हैं), जो यह स्पष्ट रूप से करता है। –

+1

@Rog - ऊपर उल्लिखित उत्तरों कभी भी यूनरी का उल्लेख नहीं करते हैं। – bmargulies

उत्तर

76

मुझे लगता है कि लेख इसे बेहतर समझाता है, लेकिन मैं इसके साथ भी अपना हाथ आजमाउंगा।

इनपुट unary रूप में है। 1 1 है, 2 11 है, 3 111 आदि है। शून्य एक खाली स्ट्रिंग है।

रेगेक्स मैचों का पहला भाग 0 और 1 गैर-प्रधान के रूप में। दूसरी बात यह है कि जादू में प्रवेश होता है।

(11+?) divisors ढूंढकर शुरू होता है। इसे 11 के रूप में परिभाषित किया जाता है, या 2. \1 एक वैरिएबल है जो पहले कैप्चर किए गए मैच का जिक्र करता है, इसलिए \1+ यह निर्धारित करता है कि उस divisor द्वारा संख्या विभाजित है या नहीं। (111111 शुरू होता है 11 चर बताए, और उसके बाद से यह तय होता है कि शेष 1111 है 11 दोहराया तो 6 2. से विभाज्य है)

नंबर दो से विभाज्य नहीं है, तो regex इंजन भाजक जुड़ जाता है। (11+?)111 बन जाता है, और हम फिर कोशिश करते हैं। यदि किसी भी समय रेगेक्स मैचों में, संख्या में एक विभाजक होता है जो शेष नहीं होता है, और इसलिए संख्या प्रमुख नहीं हो सकती है।

+21

यह खूनी शानदार है। –

+1

यह उत्तर वास्तव में अद्भुत है .. :) – espongha

6

मुझे एक मिनट के लिए इस आधार -1 में संख्या के लिए है महसूस करने के लिए लिया (एकल?) this ycombinator discussion में

कई लोगों ने काफी अच्छी तरह से यह समझाने। वास्तव में उन स्पष्टीकरणों की अपेक्षा अधिक संक्षिप्त होती है जो मुझे लगता है कि मैं प्राप्त कर सकता हूं, इसलिए मैं इसे लिंक पर छोड़ दूंगा।

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