সর্বাধিক অ্যালগরিদম যা জানা যায় তা হ'ল মূল শক্তিগুলির পণ্য হিসাবে ফ্যাক্টরিয়ালটি প্রকাশ করা। একটি চালনী পদ্ধতির ব্যবহার করে প্রতিটি প্রাইমের জন্য দ্রুত প্রাইমগুলি পাশাপাশি সঠিক শক্তি নির্ধারণ করতে পারে। প্রতিটি পাওয়ার গণনা করা পুনরাবৃত্ত স্কোয়ারিং ব্যবহার করে দক্ষতার সাথে করা যায় এবং তারপরে উপাদানগুলি একসাথে বহুগুণ হয়। এটি পিটার বি। বোরউইইন লিখেছেন, অন জটিলতার কলকারখানা সম্পর্কিত জটিলতা , জার্নাল অফ অ্যালগোরিদম 6 376–380, 1985. ( পিডিএফ ) সংক্ষেপে, এন !মধ্যে নির্ণিত করা যেতে পারে ও ( এন ( লগএন )3লগলগএন ) সময়, তুলনায় Ω ( এন)2লগএন ) সংজ্ঞাটি ব্যবহার করার সময় প্রয়োজন।
পাঠ্যপুস্তকটির অর্থ সম্ভবত বিভাজন এবং বিজয়ী পদ্ধতি। পণ্যটির নিয়মিত প্যাটার্নটি ব্যবহার করে কেউ n - 1 গুণকে হ্রাস করতে পারে ।
যাক বোঝাতে 1 ⋅ 3 ⋅ 5 ⋯ ( 2 এন - 1 ) একটি সুবিধাজনক স্বরলিপি হিসাবে। ( 2 এন ) এর কারণগুলি পুনরায় সাজান ! = 1 ⋅ 2 ⋅ 3 ⋯ ( 2 এন ) হিসাবে
( 2 এন ) ! = এন ! ⋅ 2 এন ⋅ 3 ⋅ 5 ⋅ 7 ⋯ ( 2 এন -এন ?1 ⋅ 3 ⋅ 5 ⋯ ( 2 এন - 1 )( 2 এন ) ! = 1 ⋅ 2 ⋅ 3 ⋯ ( 2 এন )
এখন ধরুন কিছু সংখ্যার কে > 0 এর জন্য n = 2 কে । (নিম্নলিখিত আলোচনার জটিলতা এড়াতে এটি একটি দরকারী অনুমান, এবং ধারণাটি সাধারণ এন পর্যন্ত বাড়ানো যেতে পারে)) তারপরে ( 2 কে ) ! = ( 2 কে - 1 ) ! 2 2 কে - 1 ( 2 কে - 1 ) ? এবং এই পুনরাবৃত্তিটি প্রসারিত করে,
( 2 কে ) ! =
( 2 এন ) ! = এন ! । 2এন⋅ 3 ⋅ 5 ⋅ 7 ⋯ ( 2 এন - 1 ) ।
n = 2টk > 0এন( 2)ট) ! = ( 2)কে - 1) ! 22কে - 1( 2)কে - 1) ?
গণনা
( 2 কে - 1 )?( 2)ট) ! = ( 2)2কে - 1+ 2কে - 2+ ⋯ + 20) ∏i = 0কে - 1( 2)আমি) ? = ( 2)2ট- 1) ∏i = 1কে - 1( 2)আমি) ? ।
( 2)কে - 1) ?এবং প্রতিটি পর্যায়ে আংশিক পণ্যগুলি গুণিত করতে লাগে
গুণ। এটি কেবলমাত্র সংজ্ঞাটি ব্যবহার করে
2 কে - 2 গুণ থেকে প্রায়
2 এর একটি ফ্যাক্টরের একটি উন্নতি ।
2 এর শক্তি গণনা করার জন্য কিছু অতিরিক্ত ক্রিয়াকলাপ প্রয়োজন , তবে বাইনারি গাণিতিক ক্ষেত্রে এটি সস্তায় করা যেতে পারে (সুনির্দিষ্টভাবে কী প্রয়োজন তার উপর নির্ভর করে, এটি কেবল
2 কে - 1 জিরোয়ের একটি প্রত্যয় যুক্ত করতে পারে)।
( কে - 2 ) + 2কে - 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% দ্বারা
কাজ একটি বিট সঙ্গে, এই বিষয়ে আরও উন্নত করা যায়, এছাড়াও প্রয়োজন যে সরানোর একটি শক্তি হতে 2 (দেখুন ব্যাপক আলোচনা )।n2