পাইথনে ফ্যাক্টরিয়াল, পারমুটেশন এবং কম্বিনেশন গণনা করুন এবং তৈরি করুন

ব্যবসায়

পাইথনে গাণিতিক ফাংশনের জন্য স্ট্যান্ডার্ড মডিউল ম্যাথ ফ্যাক্টোরিয়াল গণনা করতে ব্যবহার করা যেতে পারে। SciPy-এরও মোট পারমুটেশন/কম্বিনেশনের সংখ্যা গণনা করার ফাংশন রয়েছে।

itertools মডিউলটি তালিকা (অ্যারে) ইত্যাদি থেকে স্থানান্তর এবং সংমিশ্রণ তৈরি করতে এবং তাদের গণনা করতেও ব্যবহার করা যেতে পারে।

নমুনা কোড সহ এখানে ব্যাখ্যা করা হয়েছে।

  • ফ্যাক্টরিয়াল:math.factorial()
  • ক্রমাগত মোট সংখ্যা গণনা করুন
    • math.factorial()
    • scipy.special.perm()
  • একটি তালিকা থেকে পারমুটেশন তৈরি করুন এবং গণনা করুন:itertools.permutations()
  • সংমিশ্রণের মোট সংখ্যা গণনা করুন
    • math.factorial()
    • scipy.special.comb()
    • কিভাবে math.factorial() ব্যবহার করবেন না
  • তালিকা থেকে সমন্বয় তৈরি করুন এবং গণনা করুন:itertools.combinations()
  • ডুপ্লিকেট সংমিশ্রণের মোট সংখ্যা গণনা করুন
  • একটি তালিকা থেকে সদৃশ সমন্বয় তৈরি করুন এবং গণনা করুন:itertools.combinations_with_replacement()

পারমুটেশন ব্যবহার করার উদাহরণ হিসাবে, নিম্নলিখিতটিও ব্যাখ্যা করা হয়েছে।

  • স্ট্রিং থেকে অ্যানাগ্রাম তৈরি করুন

আপনি যদি একটি তালিকার পরিবর্তে একাধিক তালিকার উপাদানগুলির সংমিশ্রণ তৈরি করতে চান তবে itertools.product() ব্যবহার করুন itertools মডিউলে।

ফ্যাক্টরিয়াল:math.factorial()

গণিত মডিউল একটি ফাংশন ফ্যাক্টরিয়াল() প্রদান করে যা ফ্যাক্টরিয়াল প্রদান করে।

import math

print(math.factorial(5))
# 120

print(math.factorial(0))
# 1

অ-পূর্ণসংখ্যা, ঋণাত্মক মান একটি ValueError হবে।

# print(math.factorial(1.5))
# ValueError: factorial() only accepts integral values

# print(math.factorial(-1))
# ValueError: factorial() not defined for negative values

ক্রমাগত মোট সংখ্যা গণনা করুন

math.factorial()

পারমুটেশনগুলি হল সেই সমস্ত ক্ষেত্রের সংখ্যা যেখানে n বিভিন্ন থেকে r বেছে নেওয়া হয় এবং একটি সারিতে স্থাপন করা হয়।

ফ্যাক্টরিয়াল ব্যবহার করে নিম্নোক্ত সমীকরণ দ্বারা মোট সংখ্যা, p, প্রাপ্ত করা হয়।

p = n! / (n - r)!

এটি math.factorial() ফাংশন ব্যবহার করে নিম্নরূপ গণনা করা যেতে পারে, যা ফ্যাক্টরিয়াল প্রদান করে। ⌘ অপারেটর, যেটি পূর্ণসংখ্যা বিভাজন করে, একটি পূর্ণসংখ্যার ধরন ফেরাতে ব্যবহৃত হয়।

def permutations_count(n, r):
    return math.factorial(n) // math.factorial(n - r)

print(permutations_count(4, 2))
# 12

print(permutations_count(4, 4))
# 24

scipy.special.perm()

SciPy একটি ফাংশন scipy.special.perm() প্রদান করে যা মোট পারমুটেশনের সংখ্যা প্রদান করে। একটি পৃথক SciPy ইনস্টলেশন প্রয়োজন. সংস্করণ 0.14.0 থেকে উপলব্ধ।

from scipy.special import perm

print(perm(4, 2))
# 12.0

print(perm(4, 2, exact=True))
# 12

print(perm(4, 4, exact=True))
# 24

exact=False
তৃতীয় আর্গুমেন্ট ডিফল্টরূপে উপরে সেট করা হয় এবং একটি ফ্লোটিং পয়েন্ট নম্বর প্রদান করে। মনে রাখবেন যে আপনি যদি এটি একটি পূর্ণসংখ্যা হিসাবে পেতে চান তবে আপনাকে এটিকে নিম্নরূপ সেট করতে হবে।
exact=True

মনে রাখবেন যে শুধুমাত্র “ইমপোর্ট scipy” scipy.special মডিউল লোড করবে না।

উপরের উদাহরণের মতো “scipy.special import perm থেকে” হিসাবে perm() চালান, অথবা “scipy.special আমদানি করুন” হিসাবে scipy.special.perm() চালান।

একটি তালিকা থেকে পারমুটেশন তৈরি করুন এবং গণনা করুন:itertools.permutations()

শুধুমাত্র মোট সংখ্যাই নয়, তালিকা (অ্যারে) ইত্যাদি থেকেও পারমুটেশন তৈরি এবং গণনা করা যেতে পারে।

itertools মডিউলের permutations() ফাংশন ব্যবহার করুন।

একটি পুনরাবৃত্তিযোগ্য (তালিকা বা সেট টাইপ) প্রথম আর্গুমেন্ট হিসাবে এবং দ্বিতীয় আর্গুমেন্ট হিসাবে নির্বাচিত টুকরোগুলির সংখ্যা সেই স্থানান্তরের জন্য একটি পুনরাবৃত্তিকারী প্রদান করে।

import itertools

l = ['a', 'b', 'c', 'd']

p = itertools.permutations(l, 2)

print(type(p))
# <class 'itertools.permutations'>

তাদের সব গণনা করতে, আপনি একটি লুপ ব্যবহার করতে পারেন.

for v in itertools.permutations(l, 2):
    print(v)
# ('a', 'b')
# ('a', 'c')
# ('a', 'd')
# ('b', 'a')
# ('b', 'c')
# ('b', 'd')
# ('c', 'a')
# ('c', 'b')
# ('c', 'd')
# ('d', 'a')
# ('d', 'b')
# ('d', 'c')

যেহেতু এটি একটি সীমিত পুনরাবৃত্তিকারী, তাই এটিকে list() সহ একটি তালিকা প্রকারে রূপান্তর করা যেতে পারে।

যখন তালিকার উপাদানগুলির সংখ্যা len() দিয়ে প্রাপ্ত করা হয়, তখন এটি নিশ্চিত করা যেতে পারে যে এটি ফ্যাক্টরিয়াল থেকে গণনা করা মোট সংখ্যার সাথে মেলে।

p_list = list(itertools.permutations(l, 2))

print(p_list)
# [('a', 'b'), ('a', 'c'), ('a', 'd'), ('b', 'a'), ('b', 'c'), ('b', 'd'), ('c', 'a'), ('c', 'b'), ('c', 'd'), ('d', 'a'), ('d', 'b'), ('d', 'c')]

print(len(p_list))
# 12

যদি দ্বিতীয় যুক্তিটি বাদ দেওয়া হয়, সমস্ত উপাদান নির্বাচন করার জন্য স্থানান্তর ফেরত দেওয়া হয়।

for v in itertools.permutations(l):
    print(v)
# ('a', 'b', 'c', 'd')
# ('a', 'b', 'd', 'c')
# ('a', 'c', 'b', 'd')
# ('a', 'c', 'd', 'b')
# ('a', 'd', 'b', 'c')
# ('a', 'd', 'c', 'b')
# ('b', 'a', 'c', 'd')
# ('b', 'a', 'd', 'c')
# ('b', 'c', 'a', 'd')
# ('b', 'c', 'd', 'a')
# ('b', 'd', 'a', 'c')
# ('b', 'd', 'c', 'a')
# ('c', 'a', 'b', 'd')
# ('c', 'a', 'd', 'b')
# ('c', 'b', 'a', 'd')
# ('c', 'b', 'd', 'a')
# ('c', 'd', 'a', 'b')
# ('c', 'd', 'b', 'a')
# ('d', 'a', 'b', 'c')
# ('d', 'a', 'c', 'b')
# ('d', 'b', 'a', 'c')
# ('d', 'b', 'c', 'a')
# ('d', 'c', 'a', 'b')
# ('d', 'c', 'b', 'a')

print(len(list(itertools.permutations(l))))
# 24

itertools.permutations() এ উপাদানগুলিকে অবস্থানের ভিত্তিতে বিবেচনা করা হয়, মান নয়। ডুপ্লিকেট মান বিবেচনায় নেওয়া হয় না।

l = ['a', 'a']

for v in itertools.permutations(l, 2):
    print(v)
# ('a', 'a')
# ('a', 'a')

একই নিম্নলিখিত ফাংশন প্রযোজ্য, নীচে বর্ণিত.

  • itertools.combinations()
  • itertools.combinations_with_replacement()

সংমিশ্রণের মোট সংখ্যা গণনা করুন

math.factorial()

সংমিশ্রণের সংখ্যা হল n বিভিন্ন টুকরা থেকে বেছে নেওয়ার জন্য r টুকরাগুলির সংখ্যা। ক্রমক্রমানুসারে হিসাবে বিবেচনা করা হয় না.

নিম্নোক্ত সমীকরণ দ্বারা c এর মোট সংখ্যা পাওয়া যায়।

c = n! / (r! * (n - r)!)

এটি math.factorial() ফাংশন ব্যবহার করে নিম্নরূপ গণনা করা যেতে পারে, যা ফ্যাক্টরিয়াল প্রদান করে। ⌘ অপারেটর, যেটি পূর্ণসংখ্যা বিভাজন করে, একটি পূর্ণসংখ্যার ধরন ফেরাতে ব্যবহৃত হয়।

def combinations_count(n, r):
    return math.factorial(n) // (math.factorial(n - r) * math.factorial(r))

print(combinations_count(4, 2))
# 6

scipy.special.comb()

SciPy একটি ফাংশন scipy.special.comb() প্রদান করে যা মোট সংখ্যার পারমুটেশন প্রদান করে। একটি পৃথক SciPy ইনস্টলেশন প্রয়োজন. সংস্করণ 0.14.0 থেকে উপলব্ধ। মনে রাখবেন scipy.misc.comb() নিচে বর্ণিত আর্গুমেন্টের পুনরাবৃত্তি বাস্তবায়ন করে না।

from scipy.special import comb

print(comb(4, 2))
# 6.0

print(comb(4, 2, exact=True))
# 6

print(comb(4, 0, exact=True))
# 1

exact=False
scipy.special.perm() এর মতো, তৃতীয় আর্গুমেন্ট ডিফল্টভাবে উপরে সেট করা হয় এবং একটি ফ্লোটিং-পয়েন্ট নম্বর প্রদান করে। মনে রাখবেন যে আপনি যদি এটি একটি পূর্ণসংখ্যা হিসাবে পেতে চান তবে আপনাকে এটিকে নিম্নরূপ সেট করতে হবে।
exact=True
চতুর্থ যুক্তি, পুনরাবৃত্তির সাথেও ডুপ্লিকেট সংমিশ্রণের মোট সংখ্যা পাওয়া যেতে পারে। এটি নীচে বর্ণিত হয়েছে।

আবার, মনে রাখবেন যে শুধুমাত্র “ইমপোর্ট সিপি” scipy.special মডিউল লোড করবে না।

উপরের উদাহরণের মতো, “scipy.special import comb থেকে” হিসাবে comb() চালান বা “scipy.special আমদানি করুন” হিসাবে scipy.special.comb() চালান। “scipy.misc” এর ক্ষেত্রেও একই কথা প্রযোজ্য।

কিভাবে math.factorial() ব্যবহার করবেন না

আরেকটি পদ্ধতি যা শুধুমাত্র স্ট্যান্ডার্ড লাইব্রেরি ব্যবহার করে এবং math.factorial() ব্যবহার করা পদ্ধতির চেয়ে দ্রুততর হল নিম্নলিখিত পদ্ধতি।

from operator import mul
from functools import reduce

def combinations_count(n, r):
    r = min(r, n - r)
    numer = reduce(mul, range(n, n - r, -1), 1)
    denom = reduce(mul, range(1, r + 1), 1)
    return numer // denom

print(combinations_count(4, 2))
# 6

print(combinations_count(4, 0))
# 1

তালিকা থেকে সমন্বয় তৈরি করুন এবং গণনা করুন:itertools.combinations()

তালিকা (অ্যারে) ইত্যাদির পাশাপাশি মোট সংখ্যা থেকে সমস্ত সংমিশ্রণ তৈরি এবং গণনা করা সম্ভব।

itertools মডিউল এর combinations() ফাংশন ব্যবহার করুন।

একটি পুনরাবৃত্তিযোগ্য (তালিকা বা সেট টাইপ) প্রথম আর্গুমেন্ট হিসাবে এবং দ্বিতীয় আর্গুমেন্ট হিসাবে নির্বাচিত টুকরা সংখ্যা সেই সংমিশ্রণের জন্য পুনরাবৃত্তিকারী প্রদান করে।

l = ['a', 'b', 'c', 'd']

c = itertools.combinations(l, 2)

print(type(c))
# <class 'itertools.combinations'>

for v in itertools.combinations(l, 2):
    print(v)
# ('a', 'b')
# ('a', 'c')
# ('a', 'd')
# ('b', 'c')
# ('b', 'd')
# ('c', 'd')

c_list = list(itertools.combinations(l, 2))

print(c_list)
# [('a', 'b'), ('a', 'c'), ('a', 'd'), ('b', 'c'), ('b', 'd'), ('c', 'd')]

print(len(c_list))
# 6

ডুপ্লিকেট সংমিশ্রণের মোট সংখ্যা গণনা করুন

ডুপ্লিকেট কম্বিনেশনের সংখ্যা হল সেসব ক্ষেত্রের সংখ্যা যেখানে n বিভিন্ন থেকে r বেছে নেওয়া হয়, যাতে ডুপ্লিকেটের জন্য অনুমতি দেওয়া হয়।

(n + r – 1) ভিন্নগুলির মধ্যে (r) বেছে নেওয়ার জন্য সদৃশ সংমিশ্রণের মোট সংখ্যা সমান।

অতএব, আমরা সংমিশ্রণের মোট সংখ্যা গণনা করতে উপরে সংজ্ঞায়িত ফাংশন ব্যবহার করতে পারি।

def combinations_with_replacement_count(n, r):
    return combinations_count(n + r - 1, r)

print(combinations_with_replacement_count(4, 2))
# 10

উপরে বর্ণিত “scipy.special.comb()” এ, চতুর্থ যুক্তি “পুনরাবৃত্তি=সত্য” সেট করে নকল সংমিশ্রণের মোট সংখ্যা পাওয়া যেতে পারে।
মনে রাখবেন যে আর্গুমেন্ট “পুনরাবৃত্তি” “SciPy0.14.0” এর আগের সংস্করণে “scipy.misc.comb()” এ প্রয়োগ করা হয় না।

from scipy.special import comb
print(comb(4, 2, exact=True, repetition=True))
# 10

একটি তালিকা থেকে সদৃশ সমন্বয় তৈরি করুন এবং গণনা করুন:itertools.combinations_with_replacement()

তালিকা (অ্যারে) ইত্যাদির পাশাপাশি মোট সংখ্যা থেকে সমস্ত সদৃশ সংমিশ্রণ তৈরি করা এবং গণনা করা সম্ভব।

itertools মডিউলে combinations_with_replacement() ফাংশন ব্যবহার করুন।

প্রথম যুক্তি হিসাবে একটি পুনরাবৃত্তিযোগ্য (তালিকা বা সেটের ধরন) পাস করা এবং দ্বিতীয় আর্গুমেন্ট হিসাবে নির্বাচিত অংশগুলির সংখ্যা সেই ওভারল্যাপিং সংমিশ্রণের জন্য একটি পুনরাবৃত্তিকারী প্রদান করে।

h = itertools.combinations_with_replacement(l, 2)

print(type(h))
# <class 'itertools.combinations_with_replacement'>

for v in itertools.combinations_with_replacement(l, 2):
    print(v)
# ('a', 'a')
# ('a', 'b')
# ('a', 'c')
# ('a', 'd')
# ('b', 'b')
# ('b', 'c')
# ('b', 'd')
# ('c', 'c')
# ('c', 'd')
# ('d', 'd')

h_list = list(itertools.combinations_with_replacement(l, 2))

print(h_list)
# [('a', 'a'), ('a', 'b'), ('a', 'c'), ('a', 'd'), ('b', 'b'), ('b', 'c'), ('b', 'd'), ('c', 'c'), ('c', 'd'), ('d', 'd')]

print(len(h_list))
# 10

স্ট্রিং থেকে অ্যানাগ্রাম তৈরি করুন

Itertools.permutations() স্ট্রিং পারমুটেশন (অ্যানাগ্রাম) তৈরি করা সহজ করে তোলে।

s = 'arc'

for v in itertools.permutations(s):
    print(v)
# ('a', 'r', 'c')
# ('a', 'c', 'r')
# ('r', 'a', 'c')
# ('r', 'c', 'a')
# ('c', 'a', 'r')
# ('c', 'r', 'a')

একটি স্ট্রিং এ একটি সময়ে একটি অক্ষরের একটি টিপল একত্রিত করতে এবং এটি একটি তালিকা তৈরি করতে, নিম্নলিখিতগুলি করুন৷

anagram_list = [''.join(v) for v in itertools.permutations(s)]

print(anagram_list)
# ['arc', 'acr', 'rac', 'rca', 'car', 'cra']

join() পদ্ধতি, যা একটি তালিকার উপাদানগুলিকে একত্রিত করে বা একটি স্ট্রিং-এ টুপল করে এবং তালিকা বোঝার স্বরলিপি ব্যবহার করা হয়।