Python exponent: darajaga ko'tarishning 5 usuli + qo'llanishlari
Python'da darajaga ko'tarishning 5 usulini puxta o'rganing, ularning performance'i, edge case'lari hamda moliya, ML va kriptografiyadagi real hayotiy qo'llanishlarini ko'ring
Muallif: Kimberly Fessel
Agar siz qachondir aylana yuzini uning radiusidan hisoblagan yoki murakkab foiz bilan hisobingizdagi balansni tekshirgan bo'lsangiz, demak, darajalardan foydalangansiz. Ular dunyodagi eng mashhur tenglamalarning ko'pchiligining ajralmas qismi (Salom, E = mc2!), va albatta, darajaga ko'tarishni Python'da ham kod qilib yozishingiz mumkin.
Biroq sizni hayratga solishi mumkin bo'lgan narsa — Python'da darajaga ko'tarishning nihoyatda ko'p usullari borligi. Ushbu maqolada asos qiymatni darajaga ko'tarishning 1 ta emas, 2 ta ham emas, balki 5 ta turli Pythonic usulini ko'rib chiqamiz. Masalalaringiz uchun darajaga ko'tarish usulini tanlashda variantlaringizni sinchiklab o'ylab ko'rishingiz kerak bo'ladi, shuning uchun usullarning performance bo'yicha yonma-yon taqqoslanishi va bir nechta edge case "tuzoq"lari bilan tanishish uchun o'qishda davom eting.
Python'da darajaga ko'tarish nima?
Python'da darajaga ko'tarish matematikadagiga o'xshash tarzda ishlaydi. Biror qiymatni (x) darajaga (p) ko'targanimizda, buni o'sha qiymatni o'z-o'ziga p marta ko'paytirish deb tasavvur qilishdan boshlashingiz mumkin.

Python'da qiymatni darajaga ko'tarishning eng keng tarqalgan usuli — ikkita yulduzcha, ** bilan ifodalanadigan exponent operator'i.
1-usul: exponent operator'i (**)
Python'da darajaga ko'tarishni ko'pincha exponent operator'i, ya'ni ** bilan uchratasiz; uni ba'zan power operator'i deb ham atashadi. Uni shunchaki asos bilan unga ko'tarmoqchi bo'lgan darajangiz orasiga qo'ying. Masalan:
print(5 ** 2)
# Expected result:
# 25
Python buni 5 ning 2-darajasi, ya'ni 5 ning kvadrati deb tushunadi va natijangiz — 25 ni qaytaradi.
Yanada aniqroq tasavvur qilish uchun yana bir nechta misol:
print(2 ** 4)
print(29 ** 1)
print(7 ** 0)
# Expected result:
# 16
# 29
# 1
Kod misollarida operator precedence
Arifmetik operatorlarning precedence'i uchun Python PEMDAS (parentheses — qavslar, exponentiation — darajaga ko'tarish, multiplication and division — ko'paytirish va bo'lish, addition and subtraction — qo'shish va ayirish) qoidasiga amal qiladi. Bitta hisob-kitobga bir nechta operator kiritganingizda, Python avval qavs ichidagi expression'larni ichkaridan tashqariga qarab hisoblashdan boshlaydi. Keyin chapdan o'ngga qarab har qanday ko'paytirish va bo'lish hisob-kitoblarini bajarishdan oldin barcha darajaga ko'tarishlarni bajaradi. Floor division (//) va modulo (%) ham xuddi shu darajada turadi. Qo'shish va ayirishni Python eng oxiriga, yana chapdan o'ngga qarab bajarish uchun qoldiradi.
Arifmetik precedence amalda qanday ishlashini ko'rish uchun quyidagi misollarga nazar tashlang:
print(3 + 3 ** 2)
print((3 + 3) ** 2)
print(9 - 2 ** 3 * 3)
# Expected result:
# 12
# 36
# -15
Manfiy qiymatlar
Siz Python'ning exponent operator'ini manfiy bo'lmagan qiymatlar uchun ko'rdingiz, lekin asos yoki daraja noldan pastga tushsa nima bo'ladi? Keling, matematikadan boshlaylik.
Manfiy asos
Matematikada manfiy qiymatni o'z-o'ziga ko'paytirish musbat natija beradi. Masalan
(−1)2=−1⋅−1=1(-1)^2 = -1 · -1 = 1(−1)2=−1⋅−1=1
Bu shuni anglatadiki, manfiy asosni har safar juft darajaga ko'targaningizda, manfiy ishoralar bir-birini yo'qotib, musbat natija beradi. Biroq manfiy sonni toq darajaga ko'tarsangiz, bitta manfiy ishora o'zini yo'qotadigan juftsiz qoladi va natija manfiy qiymatga ega bo'ladi.
Python ham shunday ishlaydi, faqat bitta muhim shart bor. Darajaga ko'tarishda manfiy qiymatni qavsga olishingiz shart. Darajaga ko'tarish ayirishdan yuqoriroq precedence'ga ega, shuning uchun qavslarsiz Python avval darajaga ko'tarishni bajaradi va manfiy ishorani undan keyin hisobga oladi. Kodda bu vaziyat quyidagicha ko'rinadi:
print(-3 ** 2)
print((-3) ** 2)
# Expected result:
# -9
# 9
Manfiy daraja ko'rsatkichi
Agar buning o'rniga qiymatni manfiy darajaga ko'tarmoqchi bo'lsangiz, buning matematik jihatdan nimani anglatishini eslab qolishingiz kifoya. Matematikada manfiy darajaga ko'tarish birni o'sha qiymatning musbat darajasiga bo'lish bilan bir xil ma'noni anglatadi.

Manfiy ishora hisob-kitob maxrajda bajarilishi kerakligini bildiradi.
Python ham shu qoidaga amal qiladi:
print(2 ** -2)
# Expected result:
# 0.25
2 ni -2 darajaga ko'tarish bizga ¼ ni beradi va u Python'da 0.25 floating-point qiymati sifatida qaytariladi.
Kasr daraja ko'rsatkichlari
Python kasr yoki o'nli kasr daraja ko'rsatkichlarini ham qabul qiladi. Asosni kasr darajaga ko'tarish uning ildizini topish bilan bir xil natija beradi. Masalan, 36 ning kvadrat ildizini uni ½ yoki 0.5 darajaga ko'tarish orqali topishingiz mumkin:
print(36 ** 0.5)
# Expected result:
# 6.0
E'tibor bering, kasr (o'nli kasr) daraja ko'rsatkichini kiritganingizda float olasiz, faqat manfiy asosdan boshlagan holatingiz bundan mustasno — bu holda natijangiz kompleks son bo'ladi.
Floating-point arifmetikasi va aniqlik
Exponent operator'iga asos uchun ham, daraja ko'rsatkichi uchun ham butun sonlar bersangiz, Python sizga int natija qaytaradi. Boshqa tomondan, agar qiymatlardan birortasi floating-point son bo'lsa, Python sizga float qaytaradi. Butun sonlarni darajaga ko'tarishda overflow chegarasi yo'q, chunki Python arbitrary-precision butun sonlardan foydalanadi.
Python'ning floating-point sonlari odatda taxminan 15–17 ta o'nli raqamli aniqlikka ega. Kasr daraja ko'rsatkichlarini hisoblaganda aniq qiymatlarga erishishingiz mumkin, lekin erishmasligingiz ham mumkin. 125 ning kub ildizini olish 5 ga juda yaqin, ammo unga to'liq teng bo'lmagan qiymatni qaytarishi mumkin:
print(125 ** (1/3))
# Expected output:
# 4.999999999999999, or some other value close to 5
Float'lar uchun taqribiy qiymatlarni kutganingiz sababli, ularni butun sonlar bilan tenglik operatori (==) yordamida to'g'ridan-to'g'ri taqqoslamaslik orqali kodingizni himoyalashingiz mumkin. Buning o'rniga tolerance'ni tekshirish uchun math modulidagi isclose() funksiyasini sinab ko'ring:
import math
print(math.isclose(27 ** (1/3), 3))
# Expected result:
# True
2-usul: built-in pow() funksiyasi
Python'da asos qiymatni darajaga ko'tarish uchun pow() deb ataladigan built-in funksiya mavjud. pow() standart Python bilan birga keladi; undan foydalanish uchun hech qanday qo'shimcha modul yoki kutubxonani import qilishingiz shart emas. Uning ikkita majburiy argumenti bor: asos va daraja ko'rsatkichi.
print(pow(5, 2))
print(pow(-3, 2))
print(pow(2, -2))
print(pow(36, 0.5))
# Expected result:
# 25
# 9
# 0.25
# 6.0
Modular exponentiation
Exponent operator'i (**) bilan pow() o'rtasidagi asosiy farqni pow()'ga uchinchi, ixtiyoriy argument qo'shganingizda ko'rasiz. Bu argument, ya'ni mod, natijaga modulo operator'ni qo'llaydi. Shunday qilib, pow(x, p, m) quyidagini hisoblaydi:

Buni avval darajaga ko'tarishni hisoblab, keyin modulo amalini bajarish deb tasavvur qilishingiz mumkin. Masalan:
print(pow(3, 2, 5))
print(pow(2, 4, 13))
# Expected result:
# 4
# 3
3- va 4-usullar: math.pow() va math.exp()
Python'da darajaga ko'tarishning uchinchi va to'rtinchi variantlari math modulidan keladi.
math.pow()
math.pow() funksiyasi **'ga o'xshash ishlaydi; biroq math.pow(x, p) har doim floating-point son qaytaradi. Unga int yoki float argumentlar berishingiz mumkin, lekin funksiya kiritilgan qiymatlarni darhol floating-point qiymatlarga aylantiradi.
import math
print(math.pow(5, 2))
# Expected output:
# 25.0
Boshqa ilmiy hisoblash funksiyalari bilan moslik uchun aynan float kerak bo'lsa, math.pow()'dan foydalanishni tanlashingiz mumkin.
math.exp()
math modulidagi exp(x) Eyler soni e'ni (≈ 2.7182818…) x darajaga ko'taradi. U ham har doim float qaytaradi. Bu aniqlikni yo'qotmaslik uchun puxta optimizatsiya qilingan funksiya.
import math
print(math.exp(3))
print(math.exp(-2))
# Expected output:
# 20.085536923187668
# 0.1353352832366127
5-usul: numpy.power()
NumPy kutubxonasida darajaga ko'tarish uchun funksiya mavjud. x'ni p darajaga ko'tarish uchun numpy.power(x, p)'ni chaqiring. Python'ning built-in darajaga ko'tarishidan farqli o'laroq, x va/yoki p massivlar bo'lganda numpy.power() element-wise ishlaydi. U, shuningdek, optimizatsiya qilingan, kompilyatsiya qilingan routine'lardan foydalanadi, bu esa uni katta dataset'lar uchun Python loop'laridan ancha tezroq qiladi.
import numpy as np
print(np.power(5, 2))
print(np.power([1, 2, 3, 4], 3))
print(np.power([1, 2, 3, 4], [[2], [-1.]]))
# Expected output:
# 25
# [ 1 8 27 64]
# [[ 1. 4. 9. 16. ]
# [ 1. 0.5 0.33333333 0.25 ]]
Oxirgi misolda NumPy ikki massiv o'rtasidagi shape'larni moslashtirish uchun broadcasting'dan foydalanadi va qiymatlarning barcha kombinatsiyalari bo'ylab element-wise darajaga ko'tarishni qo'llaydi. Agar manfiy yoki kasr daraja ko'rsatkichlari bilan biror muammoga duch kelsangiz, NumPy butun bo'lmagan natijalarni to'g'ri hisoblay olishi uchun kiritilgan qiymatlarni float'larga aylantirishingiz kerak bo'lishi mumkin (oxirgi misolda -1. bilan qilganimiz kabi).
Matematik hisob-kitoblar uchun qaysi usuldan foydalanish kerak?
Python'da darajaga ko'tarishning ko'plab usullari orasidan tanlashda tezlik faqat bitta omil, xolos. Har bir usulning hisoblash turi va qaytariladigan type'ini ham hisobga olishni xohlaysiz. Quyida hammasini jamlab beradigan qulay jadvalni topasiz.
| Usul | Hisoblash turi | Natija type'i | Eng yaxshi qo'llanish holati | Asosiy afzalligi |
|---|---|---|---|---|
x ** p |
Skalyar | int, float yoki complex | Umumiy maqsadli | Oddiy va moslashuvchan |
pow(x, p) |
Skalyar | int, float yoki complex | ** bilan bir xil | Funksional shakl |
pow(x, p, m) |
Modulli | int | Modulli katta daraja ko'rsatkichi | Tez, ulkan sonlardan qochadi |
math.pow(x, p) |
Skalyar | float | Aniq float bilan darajaga ko'tarish | Barqaror float xatti-harakati |
np.power(x, p) |
Vectorized | ndarray | Massivlarga asoslangan hisoblashlar | Tez, broadcasting'ni qo'llab-quvvatlaydi |
Moliya, data science, data analysis, machine learning va kriptografiyadagi qo'llanishlar
Darajaga ko'tarish aholi sonining o'sishi yoki kamayishi, masofalarni hisoblash va kompyuter xotirasi hajmlarining ikkilik o'sish sur'atlari bilan bog'liq ko'plab real hayotiy masalalarda uchraydi. Qiziqishlaringiz moliya, biologiya, data science, data analysis, machine learning yoki kriptografiya bo'ladimi, hisob-kitoblarni bajarish uchun darajalar kerak bo'ladi. Quyida darajaga ko'tarish amalda uchraydigan ko'plab holatlardan bir nechtasi keltirilgan.
Murakkab foiz
Murakkab foizni hisoblashning klassik formulasi yakuniy summa A'ni asosiy investitsiyangiz P'ni yillik foiz stavkangiz r, foizning yiliga necha marta hisoblanishi n va yillardagi vaqt t ishtirok etgan expression'ga ko'paytirish orqali topadi:

Bu formulada darajaga ko'tarish ishtirok etadi va uni 10 yil davomida har oy hisoblanadigan 5% stavkali dastlabki $1,000 investitsiya uchun quyidagicha Python kodiga o'girishingiz mumkin:
P = 1000
r = 0.05
n = 12
t = 10
A = P * (1 + r/n) ** (n*t)
print(A)
# Expected output:
# 1647.00949769028
Sigmoid funksiyasi
Sigmoid funksiyasi machine learning'da binary classification uchun ishlatiladi. Sigmoid funksiyasi yoki logistic funksiya algoritmning markazida turadi.

bu yerda z — kiruvchi feature'larning chiziqli kombinatsiyasi:
z=β0+β1x1+...+βnxnz = β₀ + β₁x₁ + ... + βₙxₙz=β0+β1x1+...+βnxn
Sigmoid funksiyasi manfiy cheksizlikdan musbat cheksizlikkacha bo'lgan istalgan kiruvchi qiymatni olib, uni 0 va 1 oralig'idagi qiymatga map qiladi, bu esa binary ehtimolliklar uchun ayni muddao.
math.exp():'dan foydalanib, Python'da o'zingizning sigmoid funksiyangizni yozishingiz mumkin:
import math
def sigmoid(z):
return 1/(1 + math.exp(-z))
print(sigmoid(0))
print(sigmoid(2))
print(sigmoid(-2))
# Expected output:
# 0.5
# 0.8807970779778823
# 0.11920292202211755
RSA algoritmi
RSA algoritmi — xavfsiz aloqa, raqamli imzolar va kalit almashinuvini ta'minlaydigan public-key kriptotizim. U xabarlarni xavfsiz shifrlash va deshifrlash uchun modulli darajaga ko'tarishdan foydalanadi. Algoritm modular exponentiation'ni hisoblash oson, ammo private key'siz uni teskari bajarish qiyin ekaniga tayanadi.
Quyida tezkor modular exponentiation uchun pow(x, p, m)'dan foydalanadigan, Python'dagi RSA algoritmining oddiy namoyishi keltirilgan:
# Public key
e = 17
n = 11413
# Private key
d = 3953
# Message
M = 7501
# Encrypt
C = pow(M, e, n)
# Decrypt
M_decrypted = pow(C, d, n)
print("Encrypted:", C)
print("Decrypted:", M_decrypted)
# Expected result:
# Encrypted: 8077
# Decrypted: 7501
Xulosa
Python'da darajalarni ko'plab turli usullar bilan hisoblashingiz mumkin. Odatda standart exponent operator'idan (**) foydalanasiz, ammo modular exponentiation (pow(x, p, m)) yoki vectorized darajaga ko'tarish (numpy.power(x, p)) uchun boshqa variantlarni ham yodda tuting. O'z holatingiz uchun to'g'ri usulni tanlashda tezlik bilan birga hisoblash turi va data type'ni ham hisobga olishni unutmang.
Darajaga ko'tarish bo'yicha shaxsiy o'sishingizni davom ettirish uchun AI Tutor'ni sinab ko'ring. Suhbatni quyidagi prompt bilan boshlashingiz mumkin: