อัลกอริทึมที่ดีที่สุดที่เป็นที่รู้จักคือการแสดงแฟคทอเรียลเป็นผลิตภัณฑ์ของมหาอำนาจ หนึ่งสามารถกำหนดช่วงเวลาได้อย่างรวดเร็วเช่นเดียวกับพลังงานที่เหมาะสมสำหรับแต่ละนายกโดยใช้วิธีการตะแกรง การคำนวณพลังงานแต่ละอย่างสามารถทำได้อย่างมีประสิทธิภาพโดยใช้กำลังสองซ้ำแล้วปัจจัยจะถูกคูณเข้าด้วยกัน สิ่งนี้อธิบายโดย Peter B. Borwein, บนความซับซ้อนของการคำนวณแฟคทอเรียล , วารสารอัลกอริทึม6 376–380, 1985. ( PDF ) โดยย่อ, สามารถคำนวณได้ในO ( n ( บันทึกn ) 3บันทึกบันทึกn )เวลาเมื่อเทียบกับΩ ( nn!O(n(logn)3loglogn)Ω(n2logn)เวลาที่ต้องใช้เมื่อใช้คำจำกัดความ
สิ่งที่ตำราเรียนอาจหมายถึงคือวิธีการแบ่งและพิชิต หนึ่งสามารถลดการคูณn−1โดยใช้รูปแบบปกติของผลิตภัณฑ์
n?1⋅3⋅5⋯(2n−1)(2n)!=1⋅2⋅3⋯(2n)
(2n)!=n!⋅2n⋅3⋅5⋅7⋯(2n−1).
n=2kk>0n(2k)!=(2k−1)!22k−1(2k−1)?(2k)!=(22k−1+2k−2+⋯+20)∏i=0k−1(2i)?=(22k−1)∏i=1k−1(2i)?.
(2k−1)?(k−2)+2k−1−222k−222k−1
n?
def oddprod(l,h)
p = 1
ml = (l%2>0) ? l : (l+1)
mh = (h%2>0) ? h : (h-1)
while ml <= mh do
p = p * ml
ml = ml + 2
end
p
end
def fact(k)
f = 1
for i in 1..k-1
f *= oddprod(3, 2 ** (i + 1) - 1)
end
2 ** (2 ** k - 1) * f
end
print fact(15)
แม้แต่รหัสผ่านแรกนี้ก็ยังดีขึ้นเล็กน้อย
f = 1; (1..32768).map{ |i| f *= i }; print f
ประมาณ 20% ในการทดสอบของฉัน
n2