सबसे अच्छा एल्गोरिथ्म जो ज्ञात है वह मुख्य शक्तियों के उत्पाद के रूप में फैक्टरियल को व्यक्त करने के लिए है। एक छलनी दृष्टिकोण का उपयोग करके प्रत्येक प्राइम के लिए सही तरीके से और साथ ही साथ जल्दी से सही शक्ति निर्धारित कर सकते हैं। प्रत्येक शक्ति का कम्प्यूटिंग दोहराया स्क्वैरिंग का उपयोग करके कुशलता से किया जा सकता है, और फिर कारकों को एक साथ गुणा किया जाता है। यह पीटर बी बोरवेइन द्वारा वर्णित किया गया था, कैलकुलेटिंग फैक्टर्स की जटिलता पर , जर्नल ऑफ़ अल्गोरिदम 6 6 376–80, 1985। ( पीडीएफ ) संक्षेप में,परिभाषा का उपयोग करते समय आवश्यक समय की तुलना में समय में गणना की जा सकती है ।n!O(n(logn)3loglogn)Ω(n2logn)
पाठ्यपुस्तक का शायद यह मतलब था कि फूट डालो और जीतो विधि थी। कोई भी उत्पाद के नियमित पैटर्न का उपयोग करके गुणन को कम कर सकता है ।n−1
चलोएक सुविधाजनक संकेतन के रूप में को निरूपित करें । के कारकों को पुनर्व्यवस्थित करें as
अब कुछ पूर्णांक लिए मान लीजिए । (यह निम्नलिखित चर्चा में जटिलताओं से बचने के लिए एक उपयोगी धारणा है, और विचार को सामान्य तक बढ़ाया जा सकता है ।) फिरऔर इस पुनरावृत्ति का विस्तार करके,
कम्प्यूटिंग1 ⋅ 3 ⋅ 5 ⋯ ( 2 n - 1 ) ( 2 n ) ! = 1 ⋅ 2 ⋅ 3 ⋯ ( 2 n ) ( 2 n ) ! = एन ! ⋅ 2 n ⋅ 3 ⋅ 5 ⋅ 7 ⋯ ( 2 n - 1 ) । n = 2 k k >n?1⋅3⋅5⋯(2n−1)(2n)!=1⋅2⋅3⋯(2n)
(2n)!=n!⋅2n⋅3⋅5⋅7⋯(2n−1).
n=2kएन ( 2 k ) ! = ( 2 k - 1 ) ! 2 2 k - 1 ( 2 k - 1 ) ? ( २ के ) ! = ( 2 2 कश्मीर - 1 + 2 कश्मीर - 2 + ⋯ + 2 0 ) कश्मीर - 1 Π मैं = 0 ( 2 मैं )k>0n(2k)!=(2k−1)!22k−1(2k−1)?( २ k - १ ) ?(2k)!=(22k−1+2k−2+⋯+20)∏i=0k−1(2i)?=(22k−1)∏i=1k−1(2i)?.
(2k−1)?और प्रत्येक चरण में आंशिक उत्पादों को गुणा करना गुणा करता है। यह केवल परिभाषा का उपयोग करके गुणा से लगभग कारक का सुधार है । की शक्ति की गणना करने के लिए कुछ अतिरिक्त परिचालनों की आवश्यकता होती है , लेकिन बाइनरी अंकगणित में यह सस्ते में किया जा सकता है (इसके अनुसार क्या ठीक है, इसके लिए बस शून्य के प्रत्यय को जोड़ने की आवश्यकता हो सकती है )।
2 2 k - 2(k−2)+2k−1−222k−22 k - 122k−1
निम्न रूबी कोड इसका एक सरलीकृत संस्करण लागू करता है। यह recomputing से नहीं बचता हैयहां तक कि जहां यह ऐसा कर सकता है: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