निम गुणन


17

पृष्ठभूमि

यदि आप बहुत कोड गोल्फिंग करते हैं, तो आप बिटवाइज़ XOR ऑपरेशन के बारे में जानते हैं । दो पूर्णांकों को देखते हुए, यह 1बिट्स में एस के साथ एक और पूर्णांक देता है जहां दोनों इनपुट भिन्न होते हैं। तो, उदाहरण के लिए, 1010 XOR 0011 = 1001

यह खेल के सिद्धांत में बहुत उपयोगी है, जहां इसे "निम योग" के रूप में जाना जाता है। आप दो मैचों का योग है (यह है कि, आप एक समय में एक खेल में चाल कर रहे हैं), मूल्य स्थिति के प्रत्येक व्यक्ति के खेल में पदों के मूल्यों के nim योग है।

लेकिन हम इसे एक कदम आगे ले जा सकते हैं। निम जोड़ के साथ और निम गुणन की एक उपयुक्त परिभाषा के साथ , हम nonnegative पूर्णांक से एक क्षेत्र बना सकते हैं। तो चुनौती गोल्फ निम गुणा करने की है।

परिभाषा

निम गुणन निम्नलिखित नियमों का पालन करता है:
किसी भी छोटी संख्या के साथ एक Fermat 2-पॉवर n = (2 ^ (2 ^ k)) का निम उत्पाद साधारण उत्पाद है।
एक Fermat 2-n की nim उत्पाद अपने आप में 3n / 2 है।
निम गुणन nim जोड़ पर वितरित करता है।
निम गुणा गुणात्मक और साहचर्य है (जैसा कि निम जोड़ है)।
गुणक पहचान 1 है (और योजक पहचान 0 है)।

किसी भी nonnegative पूर्णांक को दो की अलग-अलग शक्तियों के निम योग के रूप में लिखा जा सकता है, और दो की किसी भी शक्ति को अलग-अलग Fermat संख्याओं के उत्पाद के रूप में लिखा जा सकता है, इसलिए यह सभी nonnegative integers के लिए nim गुणन को परिभाषित करने के लिए पर्याप्त है।

उदाहरण

यह सब बहुत सार था, तो आइए एक उदाहरण के माध्यम से काम करते हैं। मैं +nim जोड़ (XOR) और *nim गुणन के लिए निरूपित करूँगा ।

6 * 13
= (4 + 2) * (8 + 4 + 1)
= (4 + 2) * ((4 * 2) + 4 + 1)
= (4 * 4 * 2) + (4 * 2 * 2) + (4 * 4) + (4 * 2) + (4 * 1) + (2 * 1)
= (6 * 2) + (4 * 3) + 6 + 8 + 4 + 2
= ((4 + 2) * 2) + 12 + 6 + 8 + 4 + 2
= (4 * 2) + (2 * 2) + 12 + 6 + 8 + 4 + 2
= 8 + 3 + 12 + 6 + 8 + 4 + 2
= 15

अतिरिक्त परीक्षण मामले

4, 4 -> 6
4, 3 -> 12
4, 7 -> 10
2, 4 -> 8
2, 3 -> 1
1, 42 -> 42

चुनौती

एक प्रोग्राम या फ़ंक्शन लिखें, जो किसी भी सुविधाजनक रूप में दो nonnegative पूर्णांकों को देखते हुए, उनके nim उत्पाद की गणना करता है।

यह , इसलिए कम से कम सबमिशन जीतता है।


1
मामले में यह पाठकों के लिए स्पष्ट नहीं है, यह XOR (कैरीलेस) गुणा से अलग है, और इसलिए उस चुनौती का डुप्लिकेट नहीं है।
xnor

1
OEIS में निम गुणन सारणी: A051775 , A051776 , A051910 , A051911
अरनुलद

यह भी ध्यान दें कि निंबर गुणा (उस पोस्ट के अनुसार) को समझने का कोई सहज तरीका नहीं है
user202729

फ़र्मेट नंबर 2 ^ (2 ^ k) +1 के होते हैं, इसलिए जिसे आप फ़र्मेट नंबर कह रहे हैं वह वास्तव में एक कम है।
केली लोल्डर

@ केलीलॉडर हाँ, यह वास्तव में एक Fermat 2-शक्ति है।

जवाबों:


8

निम , 120 बाइट्स

proc f(a,b:int):int=
 var s={0..a*b}
 for i in 0..<a*b:s=s-{f(i%%a,i/%a)xor f(a,i/%a)xor f(i%%a,b)}
 for i in s:return i

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

ठीक है, यह पागल हो सकता है, लेकिन किसी को निम में निम गुणा करना था ...

यह विकिपीडिया से मानक एल्गोरिथ्म है। समस्या यह है कि मैं भाषा नहीं जानता, इसलिए मुझे मक्खी पर मूल बातें सीखना पड़ा। विशेष रूप से, मैं हैरान था कि -=और minसेट के लिए काम नहीं किया, और सबसे अच्छा तरीका है कि मैं न्यूनतम निकालने के लिए खोजने के लिए प्रबंधित करने के लिए पुनरावृत्ति का उपयोग करना और पहला मूल्य वापस करना था। उम्मीद है, निम विशेषज्ञ मुझे इसे सुधारने में मदद करेंगे।


2
मैं सोच रहा था कि कब कोई ऐसा करने की कोशिश करेगा।


4

जेली , 16 बाइट्स

p’ß/;ß"^/ʋ€ṭ‘ḟ$Ṃ

पुनरावर्ती सूत्र xy = मेक्सिको ({ay b xb a ab: a <x, b <y}) का उपयोग निंबर गुणा के लिए करता है

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

यह काम किस प्रकार करता है

p’ß/;ß"^/ʋ€ṭ‘ḟ$Ṃ  Main link. Left argument: x. Right argument: y.

p                 Cartesian product; yield the array of all pairs [a, b] such that
                  0 < a ≤ x and 0 < b ≤ y.
 ’                Decrement, changing the conditions to 0 ≤ a < x and 0 ≤ b < y.
          ṭ       Tack; yield [y, x].
        ʋ€        Combine the four links to the left into a dyadic chain. Call it
                  with right argument [y, x] and each of the [a, b] as left one.
  ß/                  Reduce [a, b] by the main link, computing the product ab.
     ß"               Zip [a, b] with [y, x] using the main link, computing the
                      array of products [ay, xb].
    ;                 Concatenate, yielding [ab, ay, xb].
       ^/             Reduce by bitwise XOR, yielding ab ⊕ ay ⊕ xb.
                  All that's left is to compute the minimum excluded (mex) non-
                  negative integer.
             $    Combine the two links to the left into a monadic chain.
           ‘          Increment the XOR sums.
            ḟ         Filterfalse; remove all incremented sums that appear in the
                      original sums.
              Ṃ  Take the minimum if the resulting array is non-empty or yield 0.
                 If x = 0 or y = 0, the array of sums is empty and Ṃ yields 0.
                 If x > 0 and y > 0, since 0 is among the sums, this finds the
                 smallest non-sum n+1 such that n ≥ 0 is a sum.
                 In either case, Ṃ yields xy.

4

CGSuite ,52 39 22 बाइट्स

(a,b)->a.NimProduct(b)

यह एहसास नहीं था कि यह अंतर्निहित है, और गुमनाम "प्रक्रियाएं" हैं।

मूल संस्करण, 36 बाइट्स:

(a,b)->*a.ConwayProduct(*b).NimValue

या 25 बाइट्स यदि इनपुट / आउटपुट निमर्स हो सकते हैं:

(a,b)->a.ConwayProduct(b)

खैर, मुझे उम्मीद थी *a**b/ a*bकाम करने के लिए, लेकिन यह नहीं है।


निश्चित रूप से नौकरी के लिए सही उपकरण।

3

पायथ , 21 बाइट्स

Mf-TsmmxxgkdgkHgGdGH0

प्रदर्शन

निम गुणा के न्यूनतम बहिष्कृत तत्व सूत्रीकरण का उपयोग करता है, जैसा कि यहां दिया गया है

दो नेस्टेड मानचित्रों का उपयोग सभी छोटे मूल्यों ( mm ... GH) पर पुनरावृति करने के लिए किया जाता है , फिर परिणाम चपटे ( s) होते हैं। चतुर भाग के साथ आता है f-T ... 0, जहां हम पूर्णांक से ऊपर की ओर पुनरावृति करते हैं, ऊपर वर्णित सेट में निहित पहले वाले को खोजने के लिए 0 से ऊपर की ओर। इस तरह से करने से, हमें कुछ बाइट्स बचाते हुए, ऊपरी हिस्से की गणना करने की आवश्यकता नहीं है।

अंत में, फ़ंक्शन gनिम उत्पाद की गणना करता है।


3

जावास्क्रिप्ट (ईएस 6), 142 128 बाइट्स

f=(x,y,z=Math.log2,v=x&-x,t=z(x),u=z(y),s=t&u,r=s&-s)=>x<2|y<2?x*y:x>v?f(v,y)^f(x^v,y):y&y-1?f(y,x):r?f(f(x>>r,y>>r),3<<r-1):x*y
<div oninput=o.textContent=f(x.value,y.value)><input id=x><input id=y><pre id=o>

पहला कदम दोनों विभाजित करने के लिए है xऔर yकी शक्तियों का एक XOR में 2, उनके जोड़ो में ले nim उत्पादों, और फिर XOR परिणाम (क्योंकि XOR से अधिक nim उत्पाद वितरित)। एक बार जब हम के मामले को recursed है xऔर y2 के दोनों शक्तियों, हम ध्यान दें कि एक दूसरे को उपयोग करते हुए साधारण अंकगणित के साथ गुणा फर्मेट शक्तियों, तो हम इसलिए कर सकते हैं factorise xऔर yफर्मेट शक्तियों में। तो xऔर yएक फर्मेट शक्ति का हिस्सा नहीं है हम प्रक्रिया को उल्टा कर सकते हैं और केवल वापसी x * y। हालाँकि, यदि वे एक Fermat शक्ति साझा करते हैं, तो हम दोनों को विभाजित करते हैं xऔर yउस शक्ति से, nim उत्पाद की गणना करते हैं, फिर उस Fim शक्ति के nim वर्ग के साथ nim उत्पाद लेते हैं। Ungolfed:

function nimprod(x, y) {
    if (x < 2 || y < 2) return x * y;
    var v = x & -x;
    if (x > v) return nimprod(v, y) ^ nimprod(x ^ v, y); // nimprod distributes over ^
    if (y & (y - 1)) return nimprod(y, x); // x is a power of 2 but y is not
    var t = Math.log2(x);
    var u = Math.log2(y);
    var s = t & u;
    if (!s) return x * y; // x and y do not share a Fermat power
    var r = s & -s;
    return nimprod(nimprod(x >> r, y >> r), 3 << r - 1); // square the Fermat power
}

1

वोल्फ्राम लैंग्वेज (गणितज्ञ) , 81 बाइट्स

x_±y_:=Min@Complement[Range[0,x*y],##&@@Array[BitXor[x±#2,#±y,±##]&,{x,y},0]]

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

सूत्र का उपयोग करना:

αβ=MEX({α'β+αβ'+α'β':α'<α,β'<β})

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.