สมมติว่าเรามีตัวเลข 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