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

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

กำหนดจำนวน n หาความน่าจะเป็นที่ตัวหารเฉพาะ (proper divisor) ของ n จะเป็นจำนวนกำลังสองคู่ (even perfect square)

เช่น n = 36 ผลลัพธ์คือ 1/8 เพราะตัวหารเฉพาะของ 36 มี 8 ตัว {1,2,3,4,6,9,12,18} มีเพียง 4 ที่เป็นกำลังสองคู่

วิธีแก้ปัญหา

  • ถ้า n mod 4 != 0 คืนค่า 0
  • มิฉะนั้น
    • nc := n, ptr := 2
    • l := list ใหม่
    • while ptr <= sqrt(nc)
      • a := 0
      • while nc mod ptr == 0
        • a := a + 1
        • nc := floor(nc / ptr)
      • ถ้า a > 0: append a ลง l
      • ptr := ptr + 1
    • ถ้า nc > 1: append 1 ลง l
    • k := l[0], d := k + 1, no := floor(k/2)
    • สำหรับแต่ละ i ใน l[1:]
      • d := d * (i + 1)
      • no := no * (floor(i/2) + 1)
    • d := d - 1
    • ถ้า n เป็นกำลังสองสมบูรณ์: no := no - 1
    • g := gcd(d, no)
    • d := floor(d/g), no := floor(no/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))

Input

4, 27

Output

1/8