def primefactors(n): i = 2 factors = {} while i i <= n: while n % i == 0: factors[i] = factors.get(i, 0) + 1 n //= i i += 1 if i == 2 else 2 if n > 1: factors[n] = factors.get(n, 0) + 1 return factors
def alldivisorsfrompf(pf): divisors = [1] for p, exp in pf.items: divisors = [d (p e) for d in divisors for e in range(exp + 1)] return sorted(divisors)
ลองวิธีง่ายๆ แบบตรงไปตรงมาถ้าต้องการผลลัพธ์เร็วสำหรับเลขไม่ใหญ่มาก: ตรวจทุกจำนวนตั้งแต่ 1 จนถึงรากที่สองของ n แล้วเก็บคู่ตัวหาร i และ n//i วิธีนี้อ่านง่าย เห็นผลทันที และไม่ต้องคำนวณพหุคูณหรือพจนานุกรมซับซ้อน
ตัวอย่างโค้ดสั้นๆ ที่ผมมักใช้เวลาสอนเพื่อนใหม่:
import math
def divisors(n): small = [] large = [] limit = int(math.sqrt(n)) for i in range(1, limit + 1): if n % i == 0: small.append(i) if i != n // i: large.append(n // i) return small + large[::-1]
เมื่อรันกับ n = 54 ฟังก์ชันจะคืน [1, 2, 3, 6, 9, 18, 27, 54] ซึ่งตรงตามที่คาดไว้ วิธีนี้เหมาะกับงานที่อยากได้ตัวหารทั้งหมดแบบเรียงไว้ใช้ต่อ ในแง่ประสิทธิภาพ ถ้า n เล็กพอหรือปริมาณเรียกใช้ไม่มาก มันเรียบง่ายและอ่านได้ชัดเจนกว่าการทำ prime factorization โดยตรง นอกจากนี้ยังเป็นฐานความคิดที่ดีเมื่อต้องอธิบายแนวคิดการหา divisor ให้คนที่เพิ่งเริ่มเขียนโค้ดเข้าใจ โดยที่ไม่ต้องใช้เทคนิคซับซ้อนใดๆ