জাভার বিগইন্টিজার(BigInteger)ক্লাস – এডভান্সড

বিগইন্টিজারের কাজ শুধুমাত্র যোগ, বিয়োগ, গুণ, ভাগেই সীমাবদ্ধ নয়। এই ক্লাসের আরও অনেক মজার মজার মেথড আছে, যা দিয়ে বিশাল বিশাল সংখ্যার অনেক গাণিতিক সমস্যা খুব সহজেই সমাধান করা যায়।

বিগইন্টিজার ক্লাসের বেসিক না জানা থাকলে এই লিঙ্কে একটা ঢুঁ মেরে আসতে হবে!

 

জাভার বিগইন্টিজার(BigInteger)ক্লাস – বেসিক

 

কিছু গুরুত্বপূর্ণ মেথডঃ

 

.compareTo(): নাম শুনেই বোঝা যাচ্ছে এই মেথড দুটি বিগইন্টিজারের মধ্যে কম্পেয়ার করে।

 

মেথডটি লেখা হয় এইভাবেঃ

 

a.compareTo(b);      //return value 0,-1,1

রিটার্ন ভ্যালু 0 হলে a = b, -1 হলে a < b, 1 হলে a > b

 


.equals()
: এই মেথডের রিটার্ন ভ্যালু একটি Boolean. প্যারামিটার হিসেবে এটি একটি অবজেক্ট নিয়ে থাকে, এবং বিগইন্টিজার ভ্যালুর সমান হলে true, সমান না হলে false রিটার্ন করে।

 

a.equals(b);  //comparing a with b, both are BigIntegers

a.equals(“100”);  //comparing with an object value 100

 

.intValue(), .longValue(), .doubleValue(): মেথডগুলো ক্রমান্বয়ে বিগইন্টিজার ভ্যালুকে integer, long integer এবং double ভ্যালুতে কনভার্ট করে।

 

মেথডগুলো লিখতে হবে এভাবেঃ

 

 int a = Big.intValue();

 long b = Big.longValue();

 double c = Big.doubleValue();

 

আচ্ছা, যে ভ্যালুটাকে কনভার্ট করব, সেটা যদি ইন্টিজার কিংবা লং ডাটা টাইপের রেঞ্জের বাইরের কোন সংখ্যা হয়, তখন? এক্ষেত্রে রেঞ্জের মধ্যে(ইন্টিজারের ক্ষেত্রে ৩২ বিট, লং এর ক্ষেত্রে ৬৪ বিট) যতটুকু ধরে, ততটুকু রেখে বাকি ইনফরমেশন ইগ্নোর করা হবে। তার মানে এখানে ইনফরমেশন লস হয়ে যাওয়ার সম্ভাবনা থাকে।

 

এ সমস্যা সমাধানের জন্য Java 8 এ আরও ২ টি মেথড আছে, .intValueExact(), .longValueExact() . যদি বিগইন্টিজার ভ্যালু রেঞ্জের বাইরে হয়, অর্থাৎ যদি ইন্টিজার কিংবা লং টাইপের ভ্যারিয়েবলে সেটা স্টোর না করা যায়, তাহলে এ মেথড দুটি এক্সেপশন থ্রো করবে।

 

.toString(), .toString(int radix) : .toString() মেথডটি বিগইন্টিজার ভ্যালুকে স্ট্রিংয়ে কনভার্ট করে।

 

String str = a.toString();

 


.toString(int radix)
মেথডটি মূলত বেস কনভার্শনের কাজ করে থাকে, কোন বিগইন্টিজার ভ্যালুকে নির্দিষ্ট বেসে কনভার্ট করে সেটাকে স্ট্রিং অবজেক্টে স্টোর করে।

 

String str = s.toString(2);     //converting s to a 2-base number

 


.abs()
: যেকোন বিগইন্টিজারের absolute value(পরমমান)রিটার্ন করে।

 

BigInteger a = b.abs();

 


.gcd()
: মেথডটি দুটি বিগইন্টিজারের GCD(Greatest Common Divisor- গসাগু)বের করে দেয়।

a,b এর GCD বের করার জন্য লিখতে হবেঃ

 

 BigInteger ans = a.gcd(b);

 


.min(), .max()
: দুটি বিগইন্টিজার ভ্যালুর মিনিমাম ও ম্যাক্সিমাম সংখ্যা বের করে।

 

BigInteger mn = a.min(b);

BigInteger mx = a.max(b);

 


.pow()
: কোন সংখ্যার পাওয়ার বের করার জন্য এই মেথডটি ব্যবহৃত হয়। প্যারামিটার হিসেবে exponent নেয়া হয়। এখানে অবশ্যই খেয়াল রাখতে হবে যে, exponent ভ্যালুটি একটি ইন্টিজার। exponent ভ্যালুটি কখনোই negative হতে পারবে না, সেক্ষেত্রে প্রোগ্রামটি এক্সেপশন থ্রো করবে।

 

মেথডটি লিখতে হবে এভাবেঃ

 

BigInteger p = a.pow(b);

 

.mod(), .remainder() : কোন সংখ্যাকে অপর সংখ্যা দিয়ে ভাগ করার পর ভাগশেষ বা mod value বের করার জন্য এই মেথড দুটি ব্যবহার করা হয়।

 

মাথার উপরে সাথে সাথেই যে “?” চিহ্ন চলে আসে তা হল, একই কাজ করার জন্য ২টা মেথডের কি প্রয়োজন? চিন্তা নেই, বাতি জ্বালাচ্ছি। 😛 এদের মধ্যে মূল পার্থক্যটা হল, .mod() সবসময় পজিটিভ ভ্যালু রিটার্ন করে, অন্যদিকে .remainder() পজিটিভ, নেগেটিভ দুইধরণের ভ্যালুই রিটার্ন করতে পারে।

 

BigInteger a =
BigInteger.valueOf(-100).mod(BigInteger.valueOf(3));                           // (-100)%3 =  2

BigInteger b = BigInteger.valueOf(-100).remainder(BigInteger.valueOf(3));               // (-100)%3 = -1

 

কনফিউজড?? একই ক্যালকুলেশনের উত্তর কিভাবে ভিন্ন ভিন্ন হল? সেটা ব্যাখ্যা করতে গেলে উপন্যাস লেখা হয়ে যাবে, তার থেকে বরং সময় করে নিচের এই লেখাটা পড়ে নেয়া যেতে পারেঃ

Modular Arithmetic

 

.modInverse(): মেথডটির কাজ হল দুটি সংখ্যার মধ্যকার মডুলার ইনভার্স বের করে দেয়া। মডুলার ইনভার্স হলঃ a-1 mod b. মডুলার ইনভার্স বের করার ক্ষেত্রে a এবং b উভয়কেই রিলেটিভলি প্রাইম হতে হবে। নতুবা এক্সেপশন থ্রো করবে এবং প্রোগ্রামটি terminate হয়ে যাবে।

 

মেথডটি লিখতে হবে এভাবেঃ

 

BigInteger ans = a.modInverse(b);

 


.modPow()
: বিগ-মড ভ্যালু বের করার জন্য এই মেথডটি ব্যবহৃত হয়। বিগ মড হচ্ছে (ap)mod b. মেথডে প্যারামিটার হিসেবে exponent modulus নেয়া হয়, উভয়েই বিগইন্টিজার।

মেথডটি লেখা হয় এভাবেঃ

 

BigInteger ans = a.modPow(p,b);

 

প্রাইমালিটি টেস্টঃ

 

খটমট নাম শুনেই ভয় পাবার কিছু নেই। সহজ ভাষায় প্রাইমালিটি টেস্ট হল কোন একটা সংখ্যা প্রাইম(মৌলিক)কিনা তা চেক করা।

এবার একটু জ্ঞান কপচাই! 😛 প্রাইমালিটি টেস্টের জন্য অনেকধরণের অ্যালগোরিদম আছে, Fermat Primality Test, Miller-Rabin Primality Test, Frobenius Primality Test ইত্যাদি ইত্যাদি। যেই অ্যালগোরিদমগুলোর নাম লেখা হয়েছে সবগুলোরই ভিত্তি সম্ভাব্যতা (Probability)। তার মানে এই অ্যালগোরিদমগুলোর সাহায্যে সম্ভাব্য প্রাইম নাম্বার বের করা হয়।

এবার আসল কথায় আসা যাক। জাভার বিগইন্টিজার ক্লাসে প্রোবাবিলিস্টিক প্রাইমালিটি টেস্টিং এর উপর ভিত্তি করে তৈরি কতগুলো মেথড আছে। মেথডগুলো একে একে দেখা যাকঃ

 

.isProbablePrime(): এই মেথডটির কাজ হচ্ছে কোন একটি বিগইন্টিজার সম্ভাব্য প্রাইম কিনা তা বলে দেয়া। মেথডটি Miller-Rabin Primality Test অ্যালগোরিদমের উপর ভিত্তি করে তৈরি। মেথডটি প্যারামিটার হিসেবে certainty নামে একটি ইন্টিজার ভ্যালু নিয়ে থাকে এবং বুলিয়ান ভ্যালু রিটার্ন করে। True রিটার্ন করলে সংখ্যাটি প্রাইম, অন্যথায় সংখ্যাটি কম্পোজিট(যৌগিক)।

 

এখানে certainty প্যারামিটার এর মাধ্যমে অসম্ভব্যতার হার বোঝানো হয়। (1-1/2certainty) এই সূত্রের মাধ্যমে কোন সংখ্যা প্রাইম হওয়ার সম্ভাব্যতা বের করা হয়। এই সম্ভাব্যতার অধিক হলেই সংখ্যাটি প্রাইম সংখ্যা অর্থাৎ মেথডটি True রিটার্ন করবে। তার মানে certainty এর মান যত বেশি হবে, সেটির প্রাইম হওয়ার সম্ভাব্যতা তত বেশি, ০ কিংবা তার চেয়ে কম হলে মেথডটি সবসময়ই True রিটার্ন করবে।

 

এখানে আরেকটা ব্যাপার খুব গুরুত্বপূর্ণ। certainty এর মান যত বেশি হবে, মেথডটি তত স্লো কাজ করবে, অর্থাৎ প্রোগ্রাম চলতেও বেশি সময় লাগবে। সাধারণত কনটেস্টে certainty ১০ হলেই সঠিক উত্তর দেয় কারণ                  1-(1/2)10  = 0.9990234375 ≈  1.
 
মেথডটি লেখা হয় এভাবেঃ

 

Boolean b = a.isProbablePrime(10);

 


.nextProbablePrime():
এই মেথডটি কোন একটি বিগইন্টিজারের পরবর্তী সম্ভাব্য প্রাইম নাম্বার বের করার জন্য ব্যবহার করা হয়। মেথডটি যে প্রাইম নাম্বার রিটার্ন করে তার কম্পোজিট হওয়ার সম্ভাবনা 2-100. মেথডটি কখনোই কোন প্রাইম নাম্বার মিস করে না, অর্থাৎ মেথডটি কোন প্রাইম নাম্বার রিটার্ন করলে চোখ বুজে বলে দেয়া যায় যে, অবশ্যই দুটো সংখ্যার মধ্যে আর কোন প্রাইম নাম্বার নেই।
 
মেথডটি লেখা হয় এভাবেঃ

 

BigInteger ans = a.nextProbablePrime();

 

.probablePrime(): এই মেথডটি একটি নির্দিষ্ট Bit Length এর র‍্যান্ডম প্রাইম নাম্বার রিটার্ন করে। প্যারামিটার হিসেবে একটি ইন্টিজার Bit length এবং একটি র‍্যান্ডম অবজেক্ট নেয়া হয়। এক্ষেত্রেও রিটার্নকৃত সংখ্যার কম্পোজিট হওয়ার সম্ভাবনা 2-100. বিটলেন্থের মান ২ এর থেকে কম হলে এক্সেপশন থ্রো করবে।

 

মেথডটি লেখা হয় এভাবেঃ

 

Random rnd = new Random();

BigInteger ans = BigInteger.probalePrime(int bitLength, rnd);

 

এতকিছু একসাথে দেখে হয়ত প্রথমে একটু মাথা চক্কর দিতে পারে! ঘাবড়ে যাওয়ার দরকার নেই, মাথা ঠিক রাখার জন্য দরকার প্র্যাক্টিস আর প্র্যাক্টিস। মেথডগুলো আয়ত্ত করতে সবচেয়ে ভাল উপায় হল প্রব্লেম সলভ করা, তাহলে এই মেথডগুলো সম্বন্ধে কনসেপ্ট আরও ভালমত ক্লিয়ার হয়ে যাবে!

 

এখানে কিছু প্রব্লেম দেওয়া হলঃ

Basic Remains (UVA)

Sum of Consecutive Prime Numbers (UVA)

Simplifying Fractions (UVA)

Advertisements

3 thoughts on “জাভার বিগইন্টিজার(BigInteger)ক্লাস – এডভান্সড

  1. কনভেক্স হাল ট্রিক অপ্টিমাইজেশন এর উপর টিওটোরিয়াল পেলে ভাল হত।
    রিসেন্টলি আপনার জাভার বিগ ইন্টেজার এবং পলিসি বেইজড ডাটা স্ট্রাকচার এর টিওটোরিয়াল দেখে অনেক ভাল লাগল, এই ব্লগের স্পেশালিটি হচ্ছে এটা আনকমন কিন্তু কন্টেস্ট এর জন্য দরকারী টপিকস নিয়ে আলোচনা করে । বাংলা অন্য ব্লগ গুলায় শুধু কমন টপিকস নিয়ে আলোচনা হয় । কিন্তু অনেক আনকমঞ টপিকস আছে যেগুলা নিয়ে ইংরেজীতেও ভাল ব্লগ নেই ।

    Liked by 1 person

    1. অনেক ধন্যবাদ! অনুপ্রাণিত হলাম! 🙂

      চেষ্টা করব কনভেক্স হাল অপ্টিমাইজেশন নিয়ে লেখার! আর অনুরোধ করব, লেখাগুলো শেয়ার করে ছড়িয়ে দেবার! যত বেশি মানুষের কাছে পৌছবে, ততই আমরা আমাদের এই কনটেস্ট কমিউনিটির উপকারে আসতে পারব! 🙂

      Like

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s