Complex numbers जटिल नहीं हैं।
इन्हें बस एक ऐसे नाम की ज़रूरत है जो उतना डरावना न लगे।
ये इतनी उपयोगी हैं, खास तौर पर इंजीनियरिंग और विज्ञान में, कि Python में complex भी एक मानक संख्यात्मक टाइप है, ठीक पूर्णांकों (ints) और दशमलव संख्याओं (floats) की तरह।
Python में एक complex वैल्यू मूल रूप से दो दशमलव संख्याओं का एक जोड़ा होती है।
इन्हें "वास्तविक" और "काल्पनिक" भाग कहा जाता है, और इसका कारण इतिहास की एक अफसोसजनक बात है।
एक बार फिर, बेहतर यही है कि आप इसके पीछे की सादगी पर ध्यान दें, इन अजीब नामों पर नहीं।
सम्मिश्र संख्याएँ बनाने के दो आम तरीके हैं।
complex(real, imag) कंस्ट्रक्टर दो float पैरामीटर लेता है:>>> z1 = complex(1.5, 2.0)
>>> z1
(1.5+2j)
यह कंस्ट्रक्टर स्ट्रिंग इनपुट को भी पढ़ सकता है। इसमें एक अजीब सी बात यह है कि अगर स्ट्रिंग में रिक्त स्थान हों, तो यह विफल हो जाता है।
>>> complex('4+2j')
(4+2j)
>>> complex('4 + 2j')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: complex() arg is a malformed string
<real part> + <complex part>j लिटरल के रूप में लिखा जा सकता है, या अगर वास्तविक भाग शून्य हो तो सिर्फ़ <complex part>j के रूप में:>>> z2 = 2.0 + 1.5j
>>> z2
(2+1.5j)
अंतिम परिणाम complex() कंस्ट्रक्टर इस्तेमाल करने जैसा ही होता है।
सम्मिश्र संख्या के उस काल्पनिक भाग के लिए दो नियम हैं:
इसे j से दर्शाया जाता है (i से नहीं, जैसा आप गणित की किताबों में देख सकते हैं)।
j को किसी संख्या के ठीक बाद आना चाहिए, ताकि Python इसे वेरिएबल का नाम न समझे। ज़रूरत पड़ने पर 1j लिखिए।
>>> j
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'j' is not defined
>>> 1j
1j
>>> type(1j)
<class 'complex'>
ज़्यादातर इंजीनियर j से खुश हैं।
ज़्यादातर वैज्ञानिक और गणितज्ञ imaginary के लिए गणित के i संकेतन को पसंद करते हैं, लेकिन यह संकेतन इलेक्ट्रिकल इंजीनियरिंग में current के अर्थ में i के इस्तेमाल से टकराता है।
इसलिए Python के डिज़ाइन में इलेक्ट्रिकल इंजीनियर जीत गए।
सम्मिश्र संख्या के भागों को अलग-अलग पाने के लिए:
>>> z2.real
2.0
>>> z2.imag
1.5
कोई भी भाग शून्य हो सकता है, और तब गणितज्ञ उस संख्या को "पूरी तरह वास्तविक" या "पूरी तरह काल्पनिक" कह सकते हैं। लेकिन Python में यह फिर भी एक सम्मिश्र संख्या ही रहती है:
>>> complex(0, 1)
1j
>>> type(complex(0, 1))
<class 'complex'>
>>> complex(1, 0)
(1+0j)
आपने शायद सुना होगा कि "i (या j) -1 का वर्गमूल है"।
फिलहाल इसका मतलब बस इतना है कि काल्पनिक भाग परिभाषा से इस समानता को पूरा करता है
1j * 1j == -1 # => True
यह एक सीधा-सादा विचार है, लेकिन इससे दिलचस्प नतीजे निकलते हैं।
दशमलव संख्याओं और पूर्णांकों के साथ इस्तेमाल होने वाले ज़्यादातर operators सम्मिश्र संख्याओं के साथ भी काम करते हैं:
>>> z1 = (1.5+2j)
>>> z2 = (2+1.5j)
>>> z1 + z2 # addition
(3.5+3.5j)
>>> z1 - z2 # subtraction
(-0.5+0.5j)
>>> z1 * z2 # multiplication
6.25j
>>> z1 / z2 # division
(0.96+0.28j)
>>> z1 ** 2 # exponentiation
(-1.75+6j)
>>> 2 ** z1 # another exponentiation
(0.5188946835878313+2.7804223253571183j)
>>> 1j ** 2 # j * j == -1
(-1+0j)
सम्मिश्र संख्याओं के गुणा और भाग के नियम समझाना इस विषय के दायरे से बाहर है (और ऐसा होने की भी गुंजाइश कम है कि आपको ये क्रियाएँ अक्सर "हाथ से" करनी पड़ें)।
सम्मिश्र संख्याओं पर कोई भी गणितीय या इलेक्ट्रिकल इंजीनियरिंग परिचय यह सब बता देगा, अगर आप इस विषय में गहराई तक जाना चाहें।
या फिर, Exercism पर Complex Numbers नाम का एक अभ्यास है, जिसमें आप शुरुआती सिद्धांतों से इन क्रियाओं वाली एक सम्मिश्र संख्या क्लास बना सकते हैं।
सम्मिश्र संख्याओं पर पूर्णांक विभाजन संभव नहीं है, इसलिए // और % ऑपरेटर तथा divmod() फंक्शन सम्मिश्र संख्या टाइप के लिए काम नहीं करेंगे।
संख्यात्मक टाइप के लिए बने दो फंक्शन ऐसे हैं जो सम्मिश्र संख्याओं के साथ काम करते समय बहुत उपयोगी होते हैं:
<complex number>.conjugate() सम्मिश्र संख्या के काल्पनिक भाग का चिह्न बस बदल देता है (+ से - या इसके उलट)।
abs(<complex number>) हमेशा एक ऐसी वास्तविक संख्या लौटाता है जिसका कोई काल्पनिक भाग नहीं होता।>>> z1
(1.5+2j)
>>> z1.conjugate() # flip the z1.imag sign
(1.5-2j)
>>> abs(z1) # sqrt(z1.real ** 2 + z1.imag ** 2)
2.5
cmath मॉड्यूलPython की स्टैंडर्ड लाइब्रेरी में math मॉड्यूल है, जो वास्तविक संख्याओं के साथ काम करने की उपयोगी सुविधाओं से भरा है।
इसमें सम्मिश्र संख्याओं के साथ काम करने के लिए एक बराबर का cmath मॉड्यूल भी है।
हमारा सुझाव है कि आप इस मॉड्यूल को पढ़ें और खुद प्रयोग करके देखें, लेकिन इसकी मुख्य श्रेणियाँ ये हैं:
यहाँ कुछ स्थिरांकों का इस्तेमाल करते हुए एक उदाहरण है:
>>> import cmath
>>> euler = cmath.exp(1j * cmath.pi) # Euler's equation
>>> euler.real
-1.0
>>> round(euler.imag, 15) # round to 15 decimal places
0.0
तो प्रकृति के तीन सबसे ज़रूरी स्थिरांकों e, i (या j) और pi वाला एक सीधा-सादा एक्सप्रेशन नतीजा -1 देता है।
कुछ लोग मानते हैं कि यह पूरे गणित का सबसे सुंदर परिणाम है।
यह लगभग 1740 का है।
अगर आपकी दिलचस्पी न हो तो इस भाग को छोड़ सकते हैं।
16वीं सदी में यह अजीब और नई थी।
500 साल बाद, यह इंजीनियरिंग और भौतिक विज्ञानों का मुख्य आधार बन चुकी है।
पता यह चलता है कि जो भी चीज़ घूमती है या जिसमें तरंग जैसा गुण है, उसे बताने का सबसे सीधा तरीका सम्मिश्र संख्याएँ ही हैं। इसलिए इनका इस्तेमाल इलेक्ट्रिकल इंजीनियरिंग, ऑडियो प्रोसेसिंग, भौतिकी, कंप्यूटर गेमिंग और नेविगेशन जैसे बहुत से क्षेत्रों में बड़े पैमाने पर होता है, और ये तो बस कुछ ही उदाहरण हैं।
आप घूमती हुई चीज़ें देख सकते हैं। हो सकता है सम्मिश्र संख्याएँ दुनिया को घुमाती न हों, लेकिन दुनिया के घूमने से क्या होता है, यह समझाने में ये बहुत अच्छी हैं: किसी बड़े तूफान की कोई भी उपग्रह तस्वीर देखिए।
यह बात इतनी साफ नहीं है, पर ध्वनि तरंग जैसी होती है, रोशनी तरंग जैसी होती है, रेडियो सिग्नल तरंग जैसे होते हैं, और यहाँ तक कि आपके देश की अर्थव्यवस्था भी कम से कम कुछ हद तक तरंग जैसी होती है।
इस तरंग प्रोसेसिंग का बहुत सारा काम ट्रिग फंक्शन (sin() और cos()) से किया जा सकता है, लेकिन वह जल्दी ही उलझा हुआ हो जाता है।
सम्मिश्र एक्सपोनेंशियल्स के साथ काम करना कहीं ज़्यादा आसान है।
यह बात तभी सच है जब आप किसी गुफा में रहते हों और खाना खुद बीन-बीन कर खाते हों।
अगर आप यह किसी भी तरह की स्क्रीन पर पढ़ रहे हैं, तो आप पूरी तरह उन उपयोगी 20वीं सदी की उपलब्धियों पर निर्भर हैं जो सम्मिश्र संख्याओं के इस्तेमाल से हुईं।
सेमीकंडक्टर चिप.
फास्ट फूरियर ट्रांसफॉर्म (FFT) एल्गोरिदम.
FFT सम्मिश्र संख्याओं का एक उपयोग है, और ध्वनि प्रसारण, ऑडियो प्रोसेसिंग, फोटो और वीडियो से जुड़ी हर चीज़ में मौजूद है।
MP3 और दूसरे ऑडियो फॉर्मैट कम्प्रेशन के लिए FFT का इस्तेमाल करते हैं, जिससे कम स्टोरेज में ज़्यादा ऑडियो समा जाता है।
JPEG कम्प्रेशन और MP4 वीडियो, साथ ही बहुत से दूसरे इमेज और वीडियो फॉर्मैट भी कम्प्रेशन के लिए FFT का इस्तेमाल करते हैं।
FFT उन डिजिटल फिल्टरों में भी काम करता है जो मोबाइल टावरों को आपके निजी सिग्नल को बाकी सबके सिग्नल से अलग करने देते हैं।
तो, आप शायद ऐसी तकनीक इस्तेमाल कर रहे हैं जो हर सेकंड हज़ारों बार सम्मिश्र संख्याओं की गणना पर निर्भर करती है।