ধরুন আমাদের একটি সংখ্যা 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