স্বেচ্ছাচারিতা-নির্ভুলতা পাটিগণিত ব্যাখ্যা


92

আমি সি শিখার চেষ্টা করছি এবং সত্যিই বড় সংখ্যক (যেমন, 100 ডিজিট, 1000 অঙ্ক ইত্যাদি) নিয়ে কাজ করতে অক্ষমতা পেলাম। আমি সচেতন যে এটি করার জন্য গ্রন্থাগার রয়েছে, তবে আমি নিজে এটি প্রয়োগ করার চেষ্টা করতে চাই।

আমি কেবল জানতে চাইছি যে কারও কাছে স্বেচ্ছাচারিতা-নির্ভুলতা পাটিগণিতের একটি খুব বিশদ, মূ .় বিবরণী ব্যাখ্যা রয়েছে বা সরবরাহ করতে পারে কিনা।

উত্তর:


163

সংখ্যাকে ছোট অংশ হিসাবে বিবেচনা করার জন্য এটি পর্যাপ্ত সঞ্চয় এবং অ্যালগরিদমের সমস্ত বিষয়। ধরে নেওয়া যাক আপনার একটি সংকলক রয়েছে যার মধ্যে একটি intকেবল 0 থেকে 99 এর মধ্যে হতে পারে এবং আপনি 999999 পর্যন্ত সংখ্যা পরিচালনা করতে চান (এটি কেবল সহজ রাখতে আমরা এখানে ইতিবাচক সংখ্যাগুলি নিয়েই উদ্বেগ করব)।

আপনি প্রতিটি নম্বর তিনটি intদিয়ে এবং একই বিধিগুলি ব্যবহার করে যা আপনি (প্রাথমিকভাবে) বিদ্যালয়ে যোগ, বিয়োগ এবং অন্যান্য মৌলিক ক্রিয়াকলাপগুলির জন্য ফিরে শিখেছিলেন তা ব্যবহার করে তা করতে পারেন do

একটি স্বেচ্ছাসেবী নির্ভুল গ্রন্থাগারে, আমাদের সংখ্যা উপস্থাপনের জন্য ব্যবহৃত বেসের সংখ্যার কোনও নির্দিষ্ট সীমা নেই, মেমরিটি যা কিছু ধারণ করতে পারে তা কেবল।

উদাহরণস্বরূপ সংযোজন 123456 + 78:

12 34 56
      78
-- -- --
12 35 34

সর্বনিম্ন উল্লেখযোগ্য প্রান্ত থেকে কাজ করা:

  • প্রাথমিক বহন = 0।
  • 56 + 78 + 0 ক্যারি = 134 = 34 সহ 1 বহন
  • 34 + 00 + 1 ক্যারি = 35 = 35 সহ 0 ক্যারি
  • 12 + 00 + 0 ক্যারি = 12 = 12 সাথে 0 বহন করুন

এটি আসলে কীভাবে সংযোজন আপনার সিপিইউর অভ্যন্তরে বিট স্তরে কাজ করে।

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

আমি দশটি সর্বাধিক শক্তি ব্যবহার করে এই ধরণের স্টাফ করতে আসলে গ্রন্থাগারগুলি লিখেছি যা বর্গক্ষেত্রের ক্ষেত্রে পূর্ণসংখ্যার সাথে মানানসই হতে পারে (দুইটি এক সাথে গুণিত করার সময় ওভারফ্লো প্রতিরোধ করতে intযেমন 16-বিট int0 থেকে 99 এর মধ্যে সীমাবদ্ধ থাকে) স্কোয়ার করা হলে int9,801 (<32,768) উত্পন্ন করুন বা 32-বিট 99,980,001 (<2,147,483,648) জেনারেট করতে 9,999 এর মাধ্যমে 0 ব্যবহার করে যা অ্যালগরিদমগুলিকে ব্যাপকভাবে স্বাচ্ছন্দ্য দিয়েছে।

কিছু কৌশল অবলম্বন করা।

1 / সংখ্যা যুক্ত বা গুণনের সময়, প্রয়োজনীয় সর্বাধিক স্থানের প্রাক-বরাদ্দ করুন তবে যদি আপনি এটি খুব বেশি পেয়ে থাকেন তবে পরে হ্রাস করুন। উদাহরণস্বরূপ, দুটি 100- " intসংখ্যা " (যেখানে অঙ্ক একটি ) সংখ্যা যুক্ত করা আপনাকে কখনই 101 এর বেশি সংখ্যায় দেবে না। 12-অঙ্কের সংখ্যাকে 3 অঙ্কের সংখ্যা দিয়ে গুণ করুন কখনই 15 টির বেশি সংখ্যার উত্পন্ন করা যাবে না (অঙ্কের সংখ্যা যুক্ত করুন)।

2 / অতিরিক্ত গতির জন্য, কেবলমাত্র যদি প্রয়োজন হয় তবে সংখ্যাগুলিকে স্বাভাবিক করুন (প্রয়োজনীয় স্টোরেজ হ্রাস করুন) - আমার গ্রন্থাগারের একটি পৃথক কল হিসাবে এটি ছিল যাতে ব্যবহারকারী গতি এবং সঞ্চয়স্থানের উদ্বেগগুলির মধ্যে সিদ্ধান্ত নিতে পারে।

3 / ধনাত্মক এবং negativeণাত্মক সংখ্যার সংযোজন হ'ল বিয়োগফল, এবং numberণাত্মক সংখ্যাকে বিয়োগ করা সমান ধনাত্মক যোগ করার সমান। সংকেতগুলি সামঞ্জস্য করার পরে অ্যাড এবং বিয়োগ পদ্ধতিগুলি একে অপরকে কল করে আপনি বেশ কিছুটা কোড সংরক্ষণ করতে পারেন।

4 / ছোটদের কাছ থেকে বড় সংখ্যা বিয়োগ করা থেকে বিরত থাকুন যেহেতু আপনি অবিচ্ছিন্ন সংখ্যার সাথে শেষ করেন:

         10
         11-
-- -- -- --
99 99 99 99 (and you still have a borrow).

পরিবর্তে, 11 থেকে 10 বিয়োগ করুন, তারপরে এটিকে উপেক্ষা করুন:

11
10-
--
 1 (then negate to get -1).

আমি যে লাইব্রেরির জন্য এটি করতে হয়েছিল তার একটি মন্তব্য (পাঠ্যে রূপান্তরিত) এখানে রইল। কোডটি নিজেই, দুর্ভাগ্যক্রমে, কপিরাইটযুক্ত, তবে আপনি চারটি বুনিয়াদি ক্রিয়াকলাপ পরিচালনা করতে পর্যাপ্ত তথ্য নিতে সক্ষম হতে পারেন। নিম্নলিখিত যে ধরে -aএবং -bঋণাত্মক সংখ্যা প্রতিনিধিত্ব করেন এবং aএবংb শূন্য বা ইতিবাচক নম্বর আছে।

জন্য উপরন্তু , লক্ষণ পৃথক হয়, তাহলে অস্বীকৃতি ব্যবহার বিয়োগ:

-a +  b becomes b - a
 a + -b becomes a - b

জন্য বিয়োগ , লক্ষণ পৃথক হয়, তাহলে অস্বীকৃতি ব্যবহার উপরন্তু:

 a - -b becomes   a + b
-a -  b becomes -(a + b)

এছাড়াও আমরা বড় থেকে কম সংখ্যক বিয়োগ করছি তা নিশ্চিত করার জন্য বিশেষ হ্যান্ডলিং:

small - big becomes -(big - small)

গুণফল এন্ট্রি-লেভেল ম্যাথ ব্যবহার করে:

475(a) x 32(b) = 475 x (30 + 2)
               = 475 x 30 + 475 x 2
               = 4750 x 3 + 475 x 2
               = 4750 + 4750 + 4750 + 475 + 475

যে উপায়ে এটি অর্জন করা হয় তাতে একবারে (পিছনের দিকে) একবারে 32 টির প্রতিটি অঙ্ক বের করা জড়িত থাকে তারপরে ফলাফলটিতে যুক্ত করার জন্য একটি মান গণনা করার জন্য অ্যাড ব্যবহার করে (প্রাথমিকভাবে শূন্য)।

ShiftLeftএবং ShiftRightঅপারেশনগুলি দ্রুত গুন বা ভাগ করতে ব্যবহৃত হয়LongInt মোড়ানো মোড়কের মান ("বাস্তব" গণিতের জন্য 10) দ্বারা । উপরের উদাহরণে, আমরা 950 (ফলাফল = 0 + 950 = 950) পেতে 2 বার শূন্যের 2 বার (32 এর শেষ সংখ্যা) যুক্ত করি।

তারপরে আমরা 4750 টি পেতে শিফটটি 4750 এবং ডান শিফটটি 32 পেতে 3 টি পেতে বামে 4750 থেকে 3 বার শূন্যস্থানে 14250 পেতে তারপরে 950 এর ফলাফল যুক্ত করুন 15200 পেতে।

47500 পেতে বাম শিফট 4750, ডান শিফট 3 পেতে 0 পেতে। ডান স্থানান্তরিত 32 এখন শূন্য হওয়ায়, আমরা সমাপ্ত এবং বাস্তবে 475 x 32 সমান 15200 করে 15

বিভাগ (জন্য "gazinta" পদ্ধতি "মধ্যে যায়") এছাড়াও চতুর কিন্তু প্রথম দিকে গাণিতিক উপর ভিত্তি করে। নিম্নলিখিত দীর্ঘ বিভাগ বিবেচনা করুন 12345 / 27:

       457
   +-------
27 | 12345    27 is larger than 1 or 12 so we first use 123.
     108      27 goes into 123 4 times, 4 x 27 = 108, 123 - 108 = 15.
     ---
      154     Bring down 4.
      135     27 goes into 154 5 times, 5 x 27 = 135, 154 - 135 = 19.
      ---
       195    Bring down 5.
       189    27 goes into 195 7 times, 7 x 27 = 189, 195 - 189 = 6.
       ---
         6    Nothing more to bring down, so stop.

অতএব 12345 / 27হয় 457বাকি সঙ্গে 6। যাচাই করুন:

  457 x 27 + 6
= 12339    + 6
= 12345

এটি ড্র-ডাউন ভেরিয়েবল (প্রাথমিকভাবে শূন্য) ব্যবহার করে একবারে 12345 একের সেগমেন্টগুলি আরও 27 বা এর সমান হওয়া অবধি নামিয়ে আনতে প্রয়োগ করা হয়।

তারপরে আমরা কেবল 27 থেকে বিয়োগ করবো যতক্ষণ না আমরা 27 এর নীচে নামি - বিয়োগের সংখ্যাটি শীর্ষ রেখায় যোগ করা অংশটি।

যখন নামার জন্য আর কোনও বিভাগ নেই, তখন আমাদের ফলাফল হয়।


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

এটির পরিবর্তে দুর্ভাগ্যজনক ভুল ধারণা রয়েছে যে এটি মেমরির বাইরে চলে গেলে সহজেই বেরিয়ে আসবে (আমার মতে সাধারণ উদ্দেশ্য গ্রন্থাগারের জন্য এটি মারাত্মক ত্রুটি) তবে, আপনি যদি অতীতটি দেখতে পারেন তবে এটি কী করে তা খুব সুন্দর।

যদি আপনি লাইসেন্সের কারণে এটি ব্যবহার করতে না পারেন (বা কারণ আপনার অ্যাপ্লিকেশনটি কেবল কোনও আপাত কারণ ছাড়াই আপনি বেরিয়ে আসতে চান না) তবে আপনি নিজের কোডটিতে সংহত করার জন্য কমপক্ষে সেখান থেকে অ্যালগরিদম পেতে পারেন।

আমি আরও জানতে পেরেছি যে এমপিআইআর (জিএমপি-র একটি কাঁটাচালক ) এ থাকা বোডগুলি সম্ভাব্য পরিবর্তনগুলি নিয়ে আলোচনার জন্য আরও সুসজ্জিত - এগুলি আরও বিকাশকারী-বান্ধব গুচ্ছ বলে মনে হয়।


14
আমার মনে হয় আপনি আচ্ছাদন করেছেন "আমি কেবল জানতে চাইছি যে কারো কাছে স্বেচ্ছাসেবক-নির্ভুল গাণিতিক সম্পর্কিত খুব বিশদ, নীরব ব্যাখ্যা দেওয়া যেতে পারে কিনা" খুব ভাল
গ্র্যান্ট পিটারস

একটি ফলোআপ প্রশ্ন: মেশিন কোড অ্যাক্সেস না করে ক্যারি এবং ওভারফ্লো সেট করা / সনাক্ত করা সম্ভব?
সাসকিউ

8

চাকাটি পুনরায় উদ্ভাবন করার সময় আপনার ব্যক্তিগত উত্সাহ এবং শেখার জন্য অত্যন্ত ভাল, এটি একটি অত্যন্ত বড় কাজ। আমি এটির একটি গুরুত্বপূর্ণ অনুশীলন এবং আমি নিজে যা করেছি তা হিসাবে আপনাকে অস্বীকার করতে চাই না, তবে আপনার সচেতন হওয়া উচিত যে কাজের ক্ষেত্রে সূক্ষ্ম এবং জটিল সমস্যা রয়েছে যা বৃহত্তর প্যাকেজগুলির ঠিকানা address

উদাহরণস্বরূপ, গুণ উদাসীনভাবে, আপনি 'স্কুলবয়' পদ্ধতিটি ভাবতে পারেন, অর্থাত্ একটি নম্বর অন্যটির উপরে লিখুন, তারপরে আপনি স্কুলে যেমন শিখেছেন তখন দীর্ঘ গুণটি করবেন। উদাহরণ:

      123
    x  34
    -----
      492
+    3690
---------
     4182

তবে এই পদ্ধতিটি অত্যন্ত ধীর (O (n ^ 2), n সংখ্যাগুলির সংখ্যা হওয়ায়)। পরিবর্তে, আধুনিক বিগনাম প্যাকেজগুলি একে অপরিহার্যভাবে O (n ln (n)) অপারেশনে রূপান্তর করার জন্য একটি বিচ্ছিন্ন ফুরিয়ার ট্রান্সফর্ম বা একটি সংখ্যাসূচক রূপান্তর ব্যবহার করে।

এবং এটি কেবল পূর্ণসংখ্যার জন্য। যখন আপনি কিছু জটিল সংখ্যার আসল উপস্থাপনা (লগ, sqrt, এক্সপ্রেস, ইত্যাদি) এর আরও জটিল ক্রিয়াকলাপগুলিতে পরিণত হন তখন জিনিসগুলি আরও জটিল হয়।

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


4
"এটিকে একটি অপরিহার্যভাবে O (n ln (n)) অপারেশনে রূপান্তর করার জন্য" হয় আলাদা আলাদা ফুরিয়ার রূপান্তর বা একটি সংখ্যাসূচক রূপান্তর ব্যবহার "- এর অংশটি সম্পর্কে আমি আগ্রহী কীভাবে এটি কাজ করে? কেবলমাত্র একটি রেফারেন্স ঠিক থাকবে :)
যথাযথভাবে

4
@ বিশদভাবে: বহুবচনীয় গুণটি সমঝোতার মতো, দ্রুত সমঝোতা সম্পাদনের জন্য এফএফটি ব্যবহার করার তথ্য খুঁজে পাওয়া সহজ হওয়া উচিত। যে কোনও সংখ্যা ব্যবস্থা হ'ল বহুত্বীয়, যেখানে অঙ্কগুলি সহগ হয় এবং বেসটি বেস হয়। অবশ্যই, সংখ্যার সীমা অতিক্রম করতে আপনাকে বাহ্য যত্ন নিতে হবে।
বেন ভয়েগট

6

চাকাটি পুনরায় উদ্ভাবন করবেন না: এটি স্কোয়ারে পরিণত হতে পারে!

একটি তৃতীয় পক্ষের লাইব্রেরি যেমন GNU MP ব্যবহার করুন যা চেষ্টা ও পরীক্ষা করা হয়।


4
আমি চাই আপনি সি শিখতে চান, আমি আপনার স্থান কিছুটা কম সেট করব। বিগনাম লাইব্রেরি প্রয়োগ করা সকল ধরণের সূক্ষ্ম কারণে তুচ্ছ নয় যা কোনও শিক্ষানবিশকে ট্রিপ করবে
মিচ হুইট

4
তৃতীয় পক্ষের গ্রন্থাগার: সম্মত, তবে GMP এর লাইসেন্সিং ইস্যু রয়েছে (এলজিপিএল যদিও কার্যকরভাবে এটি জিপিএল হিসাবে কাজ করে যেহেতু এলজিপিএল-সামঞ্জস্যপূর্ণ ইন্টারফেসের মাধ্যমে উচ্চ-পারফরম্যান্সের গণিত করা খুব কঠিন)।
জেসন এস

চমৎকার ফিউটোরামার রেফারেন্স (ইচ্ছাকৃত?)
গ্রান্ট পিটার্স

7
জিএনইউ সাংসদ নিঃশর্তভাবে abort()বরাদ্দ ব্যর্থতাগুলির আহ্বান জানিয়েছে, যা কিছু অতি-বড় গণনার সাথে সংঘটিত হতে বাধ্য। এটি একটি গ্রন্থাগারের জন্য অগ্রহণযোগ্য আচরণ এবং আপনার নিজের স্বেচ্ছাসেবী-নির্ভুলতা কোড লেখার পক্ষে যথেষ্ট কারণ।
আর .. গিথহাব বন্ধ করুন সহায়তা আইসিসি

আমি সেখানে আর এর সাথে একমত হতে পারি। একটি সাধারণ উদ্দেশ্য গ্রন্থাগার যা মেমরি কম চলে যখন আপনার প্রোগ্রামের নীচে থেকে কেবল রাগটি টেনে আনে তা অযোগ্য হয় g আমি বরং তারা সুরক্ষা / পুনরুদ্ধারের জন্য কিছু গতি ত্যাগ করেছি।
প্যাক্সিডিয়াবলো

4

আপনি এটি পেনসিল এবং কাগজ দিয়ে মূলত একইভাবে করেন ...

  • নম্বরটি একটি বাফারে (অ্যারে) প্রতিনিধিত্ব করতে হবে যথেচ্ছ আকার নিতে পারে (যার অর্থ ব্যবহার mallocএবংrealloc প্রয়োজন অনুযায়ী )
  • আপনি ভাষা সমর্থিত কাঠামো ব্যবহার করে যথাসম্ভব বেসিক পাটিগণিত বাস্তবায়ন করেছেন, এবং বহন করে এবং মূলাঙ্ক-পয়েন্টটি ম্যানুয়ালি সরিয়ে নিয়েছেন
  • আপনি আরও জটিল ফাংশন নিয়ে কাজ করার দক্ষ যুক্তি খুঁজে পেতে সংখ্যা বিশ্লেষণের পাঠ্যগুলিকে ঘষেন
  • আপনি কেবল আপনার প্রয়োজন হিসাবে বাস্তবায়ন

সাধারণত আপনি গণনার প্রাথমিক ইউনিট হিসাবে ব্যবহার করবেন

  • 0-99 বা 0-255 সহ বাইট রয়েছে
  • 16 বিট শব্দ 0-9999 বা 0--65536 কেটে দেয় an
  • 32 বিট শব্দযুক্ত ...
  • ...

আপনার আর্কিটেকচার দ্বারা নির্ধারিত।

বাইনারি বা দশমিক বেসের পছন্দটি আপনার সর্বাধিক স্থান দক্ষতা, মানব পাঠযোগ্যতা এবং আপনার চিপটিতে বাইনারি কোডড ডেসিমাল (বিসিডি) গণিত সহায়তার অনুপস্থিতির উপস্থিতিগুলির উপর নির্ভর করে।


3

আপনি এটি উচ্চ বিদ্যালয়ের স্তরের গণিতের সাথে করতে পারেন। যদিও আরও উন্নত অ্যালগরিদম বাস্তবে ব্যবহৃত হয়। সুতরাং উদাহরণস্বরূপ দুটি 1024-বাইট নম্বর যুক্ত করুন:

unsigned char first[1024], second[1024], result[1025];
unsigned char carry = 0;
unsigned int  sum   = 0;

for(size_t i = 0; i < 1024; i++)
{
    sum = first[i] + second[i] + carry;
    carry = sum - 255;
}

one placeসর্বাধিক মানের যত্ন নিতে যোগ করার ক্ষেত্রে ফলাফলটি আরও বড় হতে হবে । এটা দেখ :

9
   +
9
----
18

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

বিষয়টি সম্পর্কে একটি ভাল রেফারেন্স হ'ল গাণিতিক ক্রিয়াকলাপগুলির গণ্য জটিলতা । এটি আপনাকে জানিয়েছে যে আপনি প্রয়োগ করতে চান প্রতিটি ক্রিয়াকলাপের জন্য কত স্থান প্রয়োজন। উদাহরণস্বরূপ, আপনার যদি দুটি N-digitনম্বর থাকে তবে আপনাকে 2N digitsগুণনের ফলাফল সংরক্ষণ করতে হবে ।

মিচ যেমন বলেছিলেন, বাস্তবায়ন করা এত সহজ কাজ নয়! আমি পরামর্শ দিচ্ছি আপনি টিটিম্যাথ একবার দেখে নিন যদি আপনি সি ++ জানেন।


অ্যারের ব্যবহার আমার কাছে ঘটেছিল তবে আমি আরও সাধারণ কিছু সন্ধান করছি। উত্তরের জন্য ধন্যবাদ!
টিটি।

4
হুম ... প্রশ্নকারীর নাম এবং গ্রন্থাগারের নামটি কাকতালীয় হতে পারে না, তাই না? ;)
জন ওয়াই

এলও, আমি তা লক্ষ্য করিনি! আমার ইচ্ছা টিটিম্যাথ আমার ছিল :) বিটিডব্লিউ এখানে বিষয় সম্পর্কে আমার একটি প্রশ্ন:
আরাক


3

চূড়ান্ত উল্লেখগুলির মধ্যে একটি (আইএমএইচও) হ'ল নুথের টিএওসিপি ভলিউম II। এটি এই উপস্থাপনাগুলিতে সংখ্যা এবং পাটিগণিতের ক্রিয়াকলাপ উপস্থাপনের জন্য প্রচুর অ্যালগরিদম ব্যাখ্যা করে।

@Book{Knuth:taocp:2,
   author    = {Knuth, Donald E.},
   title     = {The Art of Computer Programming},
   volume    = {2: Seminumerical Algorithms, second edition},
   year      = {1981},
   publisher = {\Range{Addison}{Wesley}},
   isbn      = {0-201-03822-6},
}

1

ধরে নিই যে আপনি নিজে একটি বড় পূর্ণসংখ্যার কোড লিখতে চান, এটি করা আশ্চর্যজনকভাবে সহজ হতে পারে, যিনি সম্প্রতি এটি করেছিলেন (যদিও এটি ম্যাটল্যাবে রয়েছে)) আমি ব্যবহৃত কয়েকটি কৌশল এখানে রইলাম:

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

  • একটি সাইন বিট আলাদাভাবে সঞ্চয় করুন।

  • দুটি সংখ্যার যোগ করা মূলত অঙ্কগুলি যুক্ত করার বিষয়, তারপরে প্রতিটি পদক্ষেপে একটি বহন করার জন্য পরীক্ষা করুন।

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

  • এমনকি আপনি যখন পৃথক দশমিক অঙ্কের স্ট্রিং হিসাবে সংখ্যাগুলি সংরক্ষণ করেন, ফলাফলের সময়ে একসময় মোটামুটি 13 দশমিক সংখ্যা অর্জনের জন্য বিভাগ (এছাড়াও মোড / রিম অপ্স) করা যেতে পারে। এটি বিভাজনের চেয়ে অনেক বেশি দক্ষ যা একবারে মাত্র 1 দশমিক অঙ্কের উপরে কাজ করে।

  • একটি পূর্ণসংখ্যার পূর্ণসংখ্যার শক্তি গণনা করতে, ঘোরের বাইনারি উপস্থাপনা গণনা করুন। তারপরে প্রয়োজন অনুসারে শক্তিগুলি গণনা করতে বারবার স্কোয়ারিং অপারেশন ব্যবহার করুন।

  • অনেকগুলি অপারেশন (ফ্যাক্টরিং, প্রাথমিকতা পরীক্ষা ইত্যাদি) পাওয়ার মডড অপারেশন থেকে উপকৃত হবে। এটি হ'ল, যখন আপনি মোড (a ^ p, N) গণনা করবেন, ক্ষুদ্রাকৃতির প্রতিটি ধাপে ফলাফল মোড এনকে হ্রাস করুন যেখানে p বাইনারি আকারে প্রকাশ করা হয়েছে। প্রথমে a ^ p গণনা করবেন না, এবং তারপরে এটি Mod N কে হ্রাস করার চেষ্টা করুন


4
আপনি যদি বেস -10 ^ 9 বা বেস -2 ^ 32 বা এর অনুরূপ কিছু না করে স্বতন্ত্র অঙ্কগুলি সঞ্চয় করে থাকেন তবে আপনার সমস্ত অভিনব কনভলিউশন-গুণনের জন্য গুণগুলি কেবল অপচয়। বিগ-হে চমত্কার অর্থহীন যখন আপনার ধ্রুবক হয় যে খারাপ ...
আর .. GitHub বন্ধ সাহায্য করা বরফ

0

এখানে পিএইচপি-তে একটি সরল (নিষ্পাপ) উদাহরণ আমি দিয়েছি।

আমি "যোগ" এবং "বহুগুণ" প্রয়োগ করেছি এবং এটি একটি ক্ষতিকারক উদাহরণের জন্য ব্যবহার করেছি।

http://adevsoft.com/simple-php-arbitrary-precision-integer-big-num-example/

কোড স্নিপ

// Add two big integers
function ba($a, $b)
{
    if( $a === "0" ) return $b;
    else if( $b === "0") return $a;

    $aa = str_split(strrev(strlen($a)>1?ltrim($a,"0"):$a), 9);
    $bb = str_split(strrev(strlen($b)>1?ltrim($b,"0"):$b), 9);
    $rr = Array();

    $maxC = max(Array(count($aa), count($bb)));
    $aa = array_pad(array_map("strrev", $aa),$maxC+1,"0");
    $bb = array_pad(array_map("strrev", $bb),$maxC+1,"0");

    for( $i=0; $i<=$maxC; $i++ )
    {
        $t = str_pad((string) ($aa[$i] + $bb[$i]), 9, "0", STR_PAD_LEFT);

        if( strlen($t) > 9 )
        {
            $aa[$i+1] = ba($aa[$i+1], substr($t,0,1));
            $t = substr($t, 1);
        }

        array_unshift($rr, $t);
     }

     return implode($rr);
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.