2017-01-15 10 views
5

मैं एक गाऊसी पूर्णांक के गाऊसी divisors के एक दृश्य उत्पन्न करने के लिए एक विधि लिखने की कोशिश कर रहा हूँ - एक गाऊसी पूर्णांक या तो एक सामान्य पूर्णांक या जटिल संख्या g = a + bi वह जगह है जहाँ a और b दोनों पूर्णांक हैं, और गॉसियन इंटीजर का गॉसियन डिवीजर g एक गॉसियन पूर्णांक d है जैसे कि g/d भी गॉसियन पूर्णांक है।अजगर 3 - जटिल संख्याओं

मुझे निम्न कोड मिला है।

def is_gaussian_integer(c): 
    """ 
     Checks whether a given real or complex number is a Gaussian integer, 
     i.e. a complex number g = a + bi such that a and b are integers. 
    """ 
    if type(c) == int: 
     return True 
    return c.real.is_integer() and c.imag.is_integer() 


def gaussian_divisors(g): 
    """ 
     Generates a sequence of Gaussian divisors of a rational or Gaussian 
     integer g, i.e. a Gaussian integer d such that g/d is also a Gaussian integer. 
    """ 
    if not is_gaussian_integer(g): 
     return 
    if g == 1: 
     yield complex(g, 0) 
     return 
    g = complex(g) if type(g) == int or type(g) == float else g 
    a = b = 1 
    ubound = int(math.sqrt(abs(g))) 
    for a in range(-ubound, ubound + 1): 
     for b in range(-ubound, ubound + 1): 
      if a or b: 
       d = complex(a, b) 
       if is_gaussian_integer(g/d): 
        yield d 
    yield g 

यह करने के लिए "ज्यादातर" काम है, लेकिन कुछ इनपुट के लिए इसे बाहर कुछ गाऊसी divisors, उदा याद आ रही है लगता है 2 के लिए मैं अनुक्रम में divisor -2 + 0j (जो केवल -2 है) शामिल करने की अपेक्षा करेगा, लेकिन यह गायब है। मैं यह नहीं समझ सकता कि यह ऐसा क्यों कर रहा है या तर्क में अंतर कहाँ है।

In [92]: list(gaussian_divisors(2)) 
Out[92]: [(-1-1j), (-1+0j), (-1+1j), -1j, 1j, (1-1j), (1+0j), (1+1j), (2+0j)] 
+0

पायथन 3 में पूर्णांक विभाजन ऑपरेटर '//' नहीं, '/' है। मुझे नहीं पता कि जटिल संचालन के साथ क्या किया जाता है। –

+0

मुझे नहीं लगता कि '//' ऑपरेटर जटिल संख्याओं पर लागू होता है, उदा। '1/1j' आपको अपेक्षित के रूप में' -1j' देता है लेकिन '1 // -1j' एक त्रुटि फेंकता है: 'TypeError: जटिल संख्या का फर्श नहीं ले सकता है।'। ऐसा शायद इसलिए है क्योंकि पूर्णांक के विपरीत जटिल संख्याओं का कोई प्राकृतिक क्रम नहीं है। – srm

+0

ठीक है, आप शायद अपने स्वयं के विभाज्यता ऑपरेटर को परिभाषित करना चाहते हैं क्योंकि '/' बड़े पर्याप्त संचालन के लिए सही तरीके से काम नहीं करेगा। इसके अलावा, 'g = 2',' ubound = 1' के लिए, इसलिए आपका लूप -1 से 1 तक जाता है। आप कभी परीक्षण नहीं करते हैं। –

उत्तर

1

के बजाय सिर्फ उपज

yield g 

आप अतिरिक्त

yield -g 

अपने छोरों शुरू करने और int(math.sqrt(abs(g))) = int(sqrt(2)) में बंद है जो क्योंकि सकता है तो बस 1 कहीं भी होगी सिर्फ परीक्षण -1, 0 और 1

Alternativly आप -2 और अपने छोरों आप या तो बढ़ाने के लिए ubound या math.ceilsqrt परिणाम की जरूरत है 2 शामिल करना चाहते हैं।

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