Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

โปรแกรมหาความน่าจะเป็นที่ตัวหารที่เหมาะสมใดๆ ของ n จะเป็นเลขกำลังสองสมบูรณ์คู่ใน Python


สมมติว่าเรามีตัวเลข 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 ทำ
      • a :=0
      • ในขณะที่ nc mod ptr เหมือนกับ 0, do
        • a :=a + 1
        • nc :=ชั้นของ (nc / ptr)
      • ถ้า a> 0 แล้ว
        • เพิ่ม a ลงในรายการ l
      • ptr :=ptr + 1
    • ถ้า nc> 1 ให้ผนวก 1 ลงในรายการ l
    • k :=l[0]
    • d :=k + 1
    • ไม่ :=ชั้นของ (k / 2)
    • สำหรับแต่ละ i ใน l[จากดัชนี 1 ถึงจุดสิ้นสุด] ทำ
      • d :=d *(i + 1)
      • ไม่ :=ไม่ * ชั้นของ (i / 2) + 1
    • d :=d - 1
    • ถ้า n เป็นกำลังสองสมบูรณ์แล้ว
      • ไม่ :=ไม่ - 1
    • g :=gcd ของ d และ no
    • d :=ชั้นของ d / g
    • ไม่ :=ชั้นไม่มี / g
    • ถ้า no เท่ากับ 0 แล้ว
      • คืน 0
    • มิฉะนั้น
      • คืนเศษส่วน no/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