गोल्फ स्यूडोप्रिम्स!


9

परिचय / पृष्ठभूमि

क्रिप्टो चैट में एक हालिया चर्चा में मुझे फ़र्मेट प्राइमलिटी टेस्ट और कारमाइकल नंबरों के साथ चर्चा / मदद करने के लिए चुनौती दी गई थी । यह परीक्षण उस आधार पर आधारित है जो हमेशा primes के लिए आयोजित होगा , लेकिन हमेशा कंपोजिट के लिए नहीं। एक नंबर है जिसके लिए आप: अब एक कारमाइकल संख्या अनिवार्य रूप से फर्मेट के परीक्षण सबसे खराब दुश्मन है करने के लिए है लेने नहीं सह रूढ़ साथ रहने के लिए प्राप्त करने के लिए । अब यदि सह-प्रधान नहीं है, तो आपको अनिवार्य रूप से एक गैर-तुच्छ कारक मिलाa^(p-1) mod p==1papa^(p-1) mod p!=1apऔर जैसा कि हम सभी जानते हैं कि फैक्टरिंग काफी कठिन हो सकती है। खासकर यदि सभी कारक पर्याप्त रूप से बड़े हैं। अब आप महसूस कर सकते हैं कि फ़र्मेट टेस्ट का उपयोग अक्सर अभ्यास में क्यों नहीं किया जाता है (अच्छी तरह से बेहतर एल्गोरिदम हैं), ऐसा इसलिए है क्योंकि ऐसे नंबर हैं जिनके लिए आपको एक डिफेंडर के रूप में (सुरक्षा के संदर्भ में) एक समान कार्य करना होगा एक हमलावर (अर्थात् कारक संख्या)।

तो अब जब हम जानते हैं कि ये संख्या कुछ आकर्षक क्यों है, तो हम उन्हें कम से कम संभव तरीके से उत्पन्न करने जा रहे हैं, इसलिए यदि हम कभी भी आवश्यकता हो तो हम केवल कोड को याद कर सकते हैं!

कारमाइकल नंबर को OEIS पर A002997 के रूप में भी जाना जाता है ।
वहाँ एक है संबंधित चुनौती पहले से ही है, लेकिन वहाँ से प्रविष्टियां क्योंकि वे के रूप में आकार का विरोध करने की गति के लिए अनुकूलित कर रहे हैं यहाँ प्रतिस्पर्धी नहीं हैं। उलटे दिशा के लिए एक ही तर्क है, यहां प्रविष्टियां आकार के पक्ष में गति के खिलाफ व्यापार-नापसंद होने की संभावना है।

विशिष्टता

इनपुट

यह एक मानक है चुनौती है, इसलिए आप nइनपुट के रूप में एक सकारात्मक या गैर-नकारात्मक पूर्णांक लेते हैं । nजैसा कि आप चाहते हैं 0- या 1-अनुक्रमित हो सकता है (कृपया संकेत दें)।

उत्पादन

जैसा कि आप पसंद करते हैं (कृपया संकेत दें) आपका आउटपुट या तो n-th कार्मिकेल नंबर या पहला nकार्मिकेल नंबर होगा।

विशिष्टता

पूर्णांक xएक कारमाइकल नंबर है, यदि और केवल अगर xसमग्र है और सभी पूर्णांकों के yसाथ gcd(x,y)=1, तो यह माना जाता है y^(x-1) mod x==1

किसी जीत?

ये है , तो बाइट जीत में सबसे छोटा कोड!
मानक IO और लूपहोले नियम लागू होते हैं।

परीक्षण के मामलों

पहले कुछ कार्मिकेल नंबर हैं:

 561,1105,1729,2465,2821,6601,8911,10585,15841,
 29341,41041,46657,52633,62745,63973,75361,101101,
 115921,126217,162401,172081,188461,252601,278545,
 294409,314821,334153,340561,399001,410041,449065,
 488881,512461

जवाबों:


8

गणितज्ञ, 71 बाइट्स

(t=s=1;While[t<=#,If[++s~Mod~CarmichaelLambda@s==1&&!PrimeQ@s,t++]];s)&  

इसे ऑनलाइन आज़माएं!

50->1461241 इसे ऑनलाइन आज़माएं!


4
Mathematica अब TiO पर है, इसलिए यदि किसी को आपकी रुचि है तो आप इसे ऑनलाइन आज़मा
श्री एक्सकोडर

@ Mr.Xcoder हे! यह बहुत अच्छा है! मैंने जोड़ा (मेरा पहला) गणितज्ञ TIO
J42161217

6

पायथन 2 , 92 बाइट्स

f=lambda j,n=1:j and f(j-([(k/n)**~-n%n for k in range(n*n)if k/n*k%n==1]<[1]*~-n),n+1)or~-n

इसे ऑनलाइन आज़माएं!

1-अनुक्रमित और गुड़ के रूप में धीमा।

सूची समझने की स्थिति में, मैं सभी पूर्णांकों को nकॉपी करने के लिए डेनिस की विधि का उपयोग करता हूं (n के कुलदेवता ), और फिर मैं x**~-n%nउन सभी के लिए गणना करता हूं। चलो इस सूची को कहते हैं L

एक कारमाइकल संख्या का पता लगाने के लिए, मैं इस सूची की तुलना कोषगत से मिलकर एक सूची के लिए n-1लोगों को। यह काम क्यों करता है?

प्रत्येक तत्व Lएक धनात्मक पूर्णांक होता है: (k/n)कोप्रेम होता है n, इसलिए (k/n)**~-nभी ऐसा है (k/n)**~-n%n > 0। इस प्रकार, इसका एकमात्र संभावित मान Lसमसामयिक रूप से कम है [1]*(n-1) जो पूरी तरह से कम से कम शामिल n-1हैं। ( मानों से अधिकL नहीं हो सकता है , जैसा कि कुलदेवता से अधिक नहीं हो सकता है ! इसलिए तुलनाएं बाहर हैं।)n-1nn-1[1,1,1,1,3] < [1,1,1,1]

यह जाँचना कि n-1प्रविष्टियों से कम हैं Lयह सुनिश्चित करता है कि nसमग्र है। ( n-1कुलदेवता होने के कारण पूर्वजन्म के समतुल्य स्थिति है।) और फिर, एक कारमाइकल संख्या होने के लिए शर्त ठीक यही है कि हर तत्व Lबराबर हो 1। तो यह लेक्सिकोग्राफिक तुलना हमें पता लगाती है कि Lहम किसमें रुचि रखते हैं।

मिस्टर एक्सकोडर ने एक बाइट को पुनरावर्ती लैम्ब्डा के रूप में स्विच करके बचाया: jहर बार जब हम एक कारमाइकल नंबर से टकराते हैं , और nहर बार जब हम फिर से हारते हैं , तो गिनता है। एक बार jशून्य हिट करने के बाद , 'वें कारमाइकल नंबर के n-1बराबर होता है original_value_of_j


5

जेली ,  12  11 बाइट्स

मील और मिस्टर Xcoder के लिए -1 बाइट (कारमाइकल फ़ंक्शन परमाणु और एक गोल्फ का उपयोग)

%Æc’=ÆP
⁹Ç#

nपहले nकारमाइकल नंबरों की सूची लेने और वापस करने वाला एक विवादास्पद लिंक ।

इसे ऑनलाइन आज़माएं!

कैसे?

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

%Æc’⁼ÆP - isCarmichael: number, n (any integer)
 Æc     - Carmicael function of n
%       - n modulo that
   ’    - decremented (0 for Carmichael numbers and primes)
     ÆP - is n prime? (1 for primes 0 otherwise)
    ⁼   - equal?

⁹Ç# - Main link: number, n
  # - count up finding the first n values satisfying:
 Ç  - ...condition: call the last link as a monad
⁹   - ...starting with a value of: literal 256

पिछले 12 बाइट्स :

Ṗ*%⁼Ṗ_ÆP
⁹Ç#

इसे ऑनलाइन आज़माएं! (हाँ, यह समय के लिए बाहर है n=3)।

कैसे?

एक संख्या, cएक कारमाइकल नंबर है यदि यह समग्र है और यह सच है कि xउठाया गया कोई भी पूर्णांक, मोडुलो के cअनुरूप है ।xc

हमें केवल अपने आप को सकारात्मक xकरने के लिए इसे जांचना होगा x=c

यह भी ध्यान रखें कि कम से x=cजांच करें कि क्या है xघात के xलिए अनुकूल है xसापेक्ष xहै, जो सच है - तो हम इस जांच करने के लिए (कम कोड के लिए इस बनाता है) की जरूरत नहीं है।

Ṗ*%⁼Ṗ_ÆP - Link 1, isCarmichaelNumber: integer c (greater than 1)
Ṗ        - pop c (uses the implicit range(c)) = [1, 2, 3, ..., c-1]
 *       - raise to the power of c (vectorises) = [1^c, 2^c, 3^c, ..., (c-1)^c]
  %      - modulo by c (vectorises) = [1^c%c, 2^c%c, 3^c%c, ..., (c-1)^c%c]
    Ṗ    - pop c = [1, 2, 3, ..., c-1]
   ⁼     - equal? (non-vectorising) = 1 if so, 0 if not
      ÆP - isPrime?(c) = 1 if so, 0 if not
     _   - subtract = 1 if Carmichael 0 if not
         -     (Note the caveat that c must be an integer greater than 1, this is because
         -      popping 1 yields [] thus the equality check will hold; same for 0,-1,...)

⁹Ç# - Main link: number, n
  # - count up finding the first n values satisfying:
 Ç  - ...condition: call the last link as a monad
⁹   - ...starting with a value of: literal 256

इसके अलावा 12 बाइट्स लेकिन कारमाइकल परमाणु का उपयोग करके पहले 33 मिनट में एक मिनट के अंदर गणना करता है।
मील

बिल्ट-इन कारमाइकल फ़ंक्शन का उपयोग करके 11 बाइट्स
मिस्टर एक्सकोडर

@ Mr.Xcoder मैं मीलों अलग से पोस्ट करने का सुझाव देने जा रहा था, फिर आपका देखा, फिर आपकी टिप्पणी देखी और हटा दी। DV हो सकता है क्योंकि किसी को लगता है कि यह मीलों के समान है 'एक के बजाय एक टिप्पणी की, लेकिन मुझे लगता है कि यह भी एक अजीब कारण है क्योंकि यह सोचने का कोई कारण नहीं है कि आपने स्वतंत्र रूप से एक ही चीज़ नहीं पाई (मुझे पता है' इस तरह से कई बार किया है)। यदि आप चाहते हैं तो मैं आपकी 11 पोस्ट करूंगा, लेकिन आपकी राय या मील का कुछ क्रेडिट लेना चाहिए।
जोनाथन एलन

@ मीलों भी ... ^
जोनाथन एलन

@JonathanAllan बस इसे स्वयं पोस्ट करें। माइंड माइल्स 'और मेरा योगदान, और मुझे नहीं लगता कि माइल्स माइंड या तो :-) (BTW मैंने
मील्स

2

ECMAScript रेगेक्स, 86 89 बाइट्स

चेतावनी: यदि आप नहीं चाहते हैं कि यह आपके लिए कुछ अनगढ़ regex जादू खराब हो जाए तो इसे न पढ़ें। यदि आप स्वयं इस जादू का पता लगाने के लिए एक शॉट लेना चाहते हैं, तो मैं अत्यधिक ECMAScript regex में कुछ समस्याओं को हल करने से शुरू करने की सलाह देता हूं: एक के बाद एक हल करने के लिए लगातार बिगाड़ने वाले टैग की गई समस्याओं की सूची के लिए इस पहले पोस्ट को देखें

^(?!(x(x+))(?!\2*$)\1*(?=\1$)(?!(xx+)\3+$))((?=(xx+?)\5*$)(?=(x+)(\6+$))\7(?!\5*$)){2,}x$

इसे ऑनलाइन आज़माएं!

# Match Carmichael numbers in the domain ^x*$ using Korselt's criterion
# N = input number (initial value of tail)
^
(?!
    # Iterate through factors \1, with \2 = \1-1, for which \2 does not divide into N-1
    (x(x+))
    (?!\2*$)           # Assert N-1 is not divisible by \2
    \1*(?=\1$)         # Assert N is divisible by \1; tail = \1
    # If the factor \1, which already passed the aboved tests, is prime, then fail the
    # outside negative lookahead, because N is not a Carmichael number.
    (?!(xx+)\3+$)
)
# Assert that N has at least 2 unique prime factors, and that all of its prime factors
# are of exactly single multiplicity (i.e. that N is square-free).
(
    (?=(xx+?)\5*$)     # \5 = smallest prime factor of tail
    (?=(x+)(\6+$))     # \6 = tail / \5 (implicitly); \7 = tool to make tail = \6
    \7                 # tail = \6
    (?!\5*$)           # Assert that tail is no longer divisible by \5, i.e. that that
                       # prime factor was of exactly single multiplicity.
){2,}
x$

इस रेगेक्स का मुख्य जादू इस भाग में है कि यह दावा करता है कि एन के सभी प्रमुख कारक बिल्कुल एकल गुणक के हैं। यह उसी तरह की चाल है जैसा मेरे मैच स्ट्रिंग्स द्वारा उपयोग किया जाता है, जिसकी लंबाई एक चौथी शक्ति है और स्मूथेस्ट नंबर रीगेक्स खोजें : सबसे छोटे प्राइम फैक्टर द्वारा बार-बार निहित विभाजन।

यह भी सीधे परीक्षण करना संभव है कि एन का कोई पूर्ण-वर्ग कारक नहीं है (यानी, कि एन वर्ग-मुक्त है)। यह गुणन एल्गोरिथ्म के एक प्रकार का उपयोग करता है जो कि एक संख्या पूर्ण वर्ग है, तो परीक्षण करने के लिए मेरी प्रचुर संख्या regex पोस्ट के पैराग्राफ में संक्षेप में वर्णित है । यह बिगाड़ने वाला है । तो आगे पढ़िए नहीं अगर आप नहीं चाहते कि आपके लिए कुछ उन्नत यूरीज़ रेगेक्स मैजिक खराब हो जाए । यदि आप स्वयं इस जादू का पता लगाने के लिए शॉट लेना चाहते हैं, तो मैं अत्यधिक सलाह देता हूं कि इस पहले की पोस्ट में लगातार बिगड़ा-टैग की गई अनुशंसित समस्याओं की सूची में कुछ समस्याओं को हल करके शुरू करें , और स्वतंत्र रूप से गणितीय अंतर्दृष्टि के साथ आने की कोशिश करें।

हालांकि इस समस्या पर एल्गोरिथ्म का उपयोग करने से कोई लाभ नहीं मिलता है। यह 97 बाइट्स के बड़े आकार के साथ एक धीमी रेगेक्स में परिणाम करता है। प्राइम मल्टीप्लिसिटी टेस्ट के बिना (जो एक लूप में दोनों का दावा करता है कि कम से कम 2 प्राइम फैक्टर हैं और वे हर एक सिंगल मल्टीप्लसिटी हैं), हमें अलग से यह बताना होगा कि एन कंपोजिट है।

^(?!(x(x+))(?!\2*$)\1*(?=\1$)(?!(xx+)\3+$)|((xx+)\5*(?=\5$))?(x(x*))(?=(\6*)\7+$)\6*$\8)(xx+)\9+$

इसे ऑनलाइन आज़माएं!


 ^
 (?!
     # Iterate through factors \1, with \2 = \1-1, for which \2 does not divide into N-1
     (x(x+))
     (?!\2*$)           # Assert N-1 is not divisible by \2
     \1*(?=\1$)         # Assert N is divisible by \1; tail = \1
     # If the factor \1, which already passed the aboved tests, is prime, then fail the
     # outside negative lookahead, because N is not a Carmichael number.
     (?!(xx+)\3+$)
 |
 # Assert that N is square-free, i.e. has no divisor >1 that is a perfect square.
     ((xx+)\5*(?=\5$))?  # cycle tail through all of the divisors of N, including N itself
     # Match iff tail is a perfect square
     (x(x*))             # \6 = potential square root; \7 = \6 - 1
     (?=
         (\6*)\7+$       # iff \6 * \6 == our number, then the first match here must result in \8 == 0
     )
     \6*$\8              # test for divisibility by \6 and for \8 == 0 simultaneously
 )
 (xx+)\9+$               # Assert that N is composite
 


2
(कड़ाई से बोलते हुए, यह एक decision-problemउत्तर है, लेकिन चुनौती एक sequenceचुनौती है।) संभवतः अधिक शक्तिशाली रेगेक्स संस्करण में वर्ग विभाजकों के लिए अधिक प्रत्यक्ष परीक्षण उपलब्ध होगा?
नील

@ नील आप सही कह रहे हैं, मैं इसे सीधे वर्ग विभाजकों के लिए परीक्षण करके नीचे गिरा सकता हूं। ECMA में, अतिरिक्त सुविधाओं की आवश्यकता नहीं है। लेकिन इससे यह बहुत धीमा हो जाएगा (और मैं इसे एक स्पॉइलर टैग के तहत छिपाना भी चाहूंगा)। मुझे लगता है कि मैं दोनों संस्करणों को शामिल करना चाहता हूं।
डेडकोड

हां, मैंने पहले ही लिखे गए रेगेक्स के लिए बहुत परेशान करने वाले सवाल खोज लिए हैं, जो सही प्रकार की चुनौती नहीं हैं। क्या मुझे अपना उत्तर हटा देना चाहिए?
डेडकोड

@ नील तुम यहाँ जाओ। मैंने आपके विचार का उपयोग करके एल्गोरिथ्म को लागू किया। शायद यही कारण है कि मैंने इसे अपने दम पर आगे बढ़ाने के लिए नहीं सोचा था; यह वास्तव में लंबे समय तक रेगेक्स में परिणत होता है, क्योंकि एक-समग्र परीक्षण की आवश्यकता होती है।
डेडकोड

(साइट के नियमों के तहत आपको अपना उत्तर हटा देना चाहिए, हाँ।) मेरा विचार था कि रेटिना रीगेक्स की अतिरिक्त विशेषताओं का उपयोग करते हुए, आप इसे नीचे कर सकते हैं ^(?!(x(x+))(?!\2*$)\1*(?=\1$)(?!(xx+)\3+$)|((^x|xx\5){2,})\4*$)(xx+)\6+$, या शायद 72 बाइट्स से भी कम।
नील


1

रेटिना , 94 बाइट्स

\d*$
x
"$+"}/^(?!(x(x+))(?!\2*$)\1*(?=\1$)(?!(xx+)\3+$)|((^x|xx\5){2,})\4*$)(xx+)\6+$/^+`$
x
x

इसे ऑनलाइन आज़माएं! 1 अनुक्रमित। तेजी से नहीं, इसलिए n>5टीआईओ के लिए समय निकल जाएगा । स्पष्टीकरण:

\d*$
x

वर्तमान मूल्य में वृद्धि। पहले पास पर, यह nआउटपुट बफ़र से हटाता है (लेकिन $+अभी भी इसे एक्सेस कर सकता है)।

/^(?!(x(x+))(?!\2*$)\1*(?=\1$)(?!(xx+)\3+$)|((^x|xx\5){2,})\4*$)(xx+)\6+$/

परीक्षण करें कि क्या वर्तमान मूल्य एक कारमाइकल नंबर है। यह @ डेडकोड ​​के वैकल्पिक एल्गोरिदम का उपयोग करता है, क्योंकि .NET / Perl / PCRE regex का उपयोग करते समय वर्ग का पता लगाने के लिए छोटा है।

^+`

वर्तमान मूल्य एक कारमाइकल नंबर होने तक दोहराएं।

$
x

वर्तमान मूल्य में वृद्धि।

"$+"}

प्रारंभिक वेतन वृद्धि और लूप nसमय से ऊपर दोहराएं ।

x

परिणाम को दशमलव में बदलें।


0

हास्केल , 95 बाइट्स

s=filter
c n=s(\x->let l=s((1==).gcd x)f;f=[1..x-1]in l/=f&&all(\y->y^(x-1)`mod`x==1)l)[1..]!!n

इसे ऑनलाइन आज़माएं!

Degolfed:

-- function to filter out Carmichael numbers
filterFunction x = 
    let coprimes = filter ((1 ==) . gcd x) lesserNumbers
        lesserNumbers = [1 .. x - 1]
    in
        -- the number x is Carmichael if it is not prime
        lesserNumbers /= coprimes && 
            -- and all of its coprimes satisfy the equation
            all (\y -> y ^ (x - 1) `mod` x == 1) coprimes

-- get n'th Carmichael number (zero-based)
c n = filter filterFunction [1..] !! n
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.