ধরুন আমাদের একটি সংখ্যা n আছে, আমাদের সম্ভাব্যতা খুঁজে বের করতে হবে যে n-এর যেকোনো সঠিক ভাজক একটি এমনকি নিখুঁত বর্গ হবে।
সুতরাং, যদি ইনপুটটি n =36 এর মত হয়, তাহলে আউটপুট হবে 1/8 কারণ 36 এর আটটি সঠিক ভাজক রয়েছে, এগুলি হল {1,2,3,4,6,9,12,18} এবং তাদের মধ্যে শুধুমাত্র একটি সংখ্যা (4) নিখুঁত বর্গ এবং জোড়।
এটি সমাধান করতে, আমরা এই পদক্ষেপগুলি অনুসরণ করব -
- যদি n mod 4 0 এর মত না হয়, তাহলে
- রিটার্ন 0
- অন্যথায়,
- nc :=n, ptr :=2
- l :=একটি নতুন তালিকা
- যখন ptr <=nc এর বর্গমূল , do
- a :=0
- যদিও nc mod ptr 0 এর মতো, do
- a :=a + 1
- nc :=(nc / ptr) এর ফ্লোর
- যদি a> 0 হয়, তাহলে
- তালিকায় একটি যোগ করুন l
- ptr :=ptr + 1
- যদি nc> 1 হয়, তাহলে তালিকায় 1 যুক্ত করুন l
- k :=l[0]
- d :=k + 1
- no :=(k / 2) এর ফ্লোর
- l[সূচী 1 থেকে শেষ পর্যন্ত] প্রতিটি i-এর জন্য, করুন
- d :=d *(i + 1)
- no :=no * (i / 2) + 1 এর তল
- d :=d - 1
- যদি n একটি নিখুঁত বর্গ হয়, তাহলে
- না :=না - 1
- g :=d এবং no এর gcd
- d :=d / g এর তল
- no :=no / g এর তল
- যদি no 0 এর মত হয়, তাহলে
- রিটার্ন 0
- অন্যথায়,
- একটি ভগ্নাংশ নম্বর/d ফেরত দিন
উদাহরণ
আরো ভালোভাবে বোঝার জন্য আসুন নিচের বাস্তবায়ন দেখি -
from math import gcd
def solve(n):
if n % 4 != 0:
return 0
else:
nc = n
ptr = 2
l = []
while ptr <= nc ** 0.5:
a = 0
while nc % ptr == 0:
a += 1
nc = nc / ptr
if a > 0:
l += [a]
ptr += 1
if nc > 1:
l += [1]
k = l[0]
d = k + 1
no = int(k / 2)
for i in l[1:]:
d = d * (i + 1)
no *= int(i / 2) + 1
d = d - 1
if int(n ** 0.5) ** 2 == n:
no -= 1
g = gcd(d, no)
d = d // g
no = no // g
if no == 0:
return 0
else:
return str(no) + '/' + str(d)
n = 36
print(solve(n)) ইনপুট
4, 27
আউটপুট
1/8