Python程式:查詢n的任何真因數是偶數完全平方數的機率


假設我們有一個數字n,我們需要找出n的任何真因數是偶數完全平方數的機率。

因此,如果輸入像n = 36,則輸出將為1/8,因為36有八個真因數,它們是{1,2,3,4,6,9,12,18},其中只有一個數字(4)是完全平方數且為偶數。

為了解決這個問題,我們將遵循以下步驟:

  • 如果n模4不等於0,則
    • 返回0
  • 否則,
    • nc := n,ptr := 2
    • l := 一個新的列表
    • 當ptr <= nc的平方根時,執行以下操作:
      • a := 0
      • 當nc模ptr等於0時,執行以下操作:
        • a := a + 1
        • nc := floor(nc / ptr)
      • 如果a > 0,則
        • 將a新增到列表l中
      • ptr := ptr + 1
    • 如果nc > 1,則將1新增到列表l中
    • k := l[0]
    • d := k + 1
    • no := floor(k / 2)
    • 對於l中從索引1到結尾的每個i,執行以下操作:
      • d := d *(i + 1)
      • no := no * floor(i / 2) + 1
    • d := d - 1
    • 如果n是完全平方數,則
      • no := no - 1
    • g := 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))

輸入

4, 27

輸出

1/8

更新於:2021年10月25日

86 次瀏覽

開啟你的職業生涯

透過完成課程獲得認證

開始學習
廣告

© . All rights reserved.