Modulus হিসাব করার ছোট্ট একটু চিন্তা ভাবনা।
আসো Modulus (%) বের করি।
ধরো তোমাকে ২ টা সংখ্যা a আর b দেওয়া আছে। তোমাকে (a+b)%c বের করতে হবে। যেখানে a,b,c এর মান 2^64 - 1 অব্দি হতে পারে যা c/c++ সর্বচ্চ মান (মানে unsigned long long int এ। এর চেয়ে বেশি ভ্যালু হলে আমরা সেটা String দিয়ে হ্যান্ডেল করি)।
কি ভাবছ? অনেক সহজেই ans=(a+b)%c; বের করলেই হয়ে গেলো তাইনা ?
আচ্ছা ধরি, a=18446744073709551614, b=100, ans = (18446744073709551614 + 100 ) % 18446744073709551615 [যেখানে c=2^64 - 1] এভাবে বের করা কি সম্ভব?,
আসলে কি হবে এখানে ? (18446744073709551614 + 100) যোগ করলে overflow হবে। (2^64 - 1 এর চেয়ে বেশি হয়ে যাবে যা unsigned long long int এও আটানো সম্ভব হবে না), যদি যোগ-ই করতে না পারি তাহলে কেমনে mod c (%c) বের করবো? যাক তাহলে ans = (a+b)%c; সমাধান কাজ করলো না।
আচ্ছা আরেকটু ভাবি, উপরের মতো করে যদি না হয় তাহলে আমাদের পরবর্তি ধাপ কি হতে পারে? উমম,! আমরা জানিতো (a+b)%c থাকলে আমরা এটাকে (a%c + b%c) %c আকারে লিখতে পারি। তারমানে ans = (a%c + b%c) %c; হুম, এখন এভাবে সমাধান করার চেস্টা করি। :-)
ans = (18446744073709551614%18446744073709551615 + 100% 18446744073709551615 ) % 18446744073709551615;
এখন দেখি আমাদের সমাধানের সাথে উপরের উদাহরণ কাজ করে কি না।
x = 18446744073709551614%18446744073709551615 =18446744073709551614
y = 100%18446744073709551615 = 100
এখন z = 18446744073709551615 -