বিপুল সংখ্যক চ্যালেঞ্জের শিরাতে আমি ভেবেছিলাম এটি আকর্ষণীয় হতে পারে।
এই চ্যালেঞ্জের ক্ষেত্রে, আমরা বড় সংখ্যায় যোগ, বিয়োগ এবং গুণক সম্পাদনের জন্য অবশিষ্টাংশ নম্বর সিস্টেম (আরএনএস) ব্যবহার করব ।
আরএনএস কি
পূর্ণসংখ্যার শনাক্ত করতে লোকেরা যেভাবে বিকাশ করেছে সেগুলির মধ্যে আরএনএস অন্যতম। এই সিস্টেমে সংখ্যাগুলি অবশিষ্টাংশের ক্রম দ্বারা প্রতিনিধিত্ব করা হয় (যা একটি মডুলাস অপারেশনের পরে ফলাফল (যেমন পূর্ণসংখ্যার বিভাগের পরে অবশিষ্ট))। এই সিস্টেমে প্রতিটি পূর্ণসংখ্যার অনেকগুলি উপস্থাপনা থাকে। জিনিসগুলিকে সহজ রাখতে, আমরা জিনিসগুলিকে সীমাবদ্ধ করতে যাচ্ছি যাতে প্রতিটি পূর্ণসংখ্যাকে স্বতন্ত্রভাবে উপস্থাপিত করা হয়। আমি মনে করি কোন দৃ concrete় উদাহরণ দিয়ে কী ঘটছে তা বর্ণনা করা আরও সহজ।
আসুন প্রথম তিনটি মৌলিক সংখ্যাগুলি দেখুন: 2, 3, 5। আরএনএস সিস্টেমে, আমরা এই তিনটি সংখ্যাটি 2 * 3 * 5 = 30 এর চেয়ে কম যে কোনও সংখ্যা অবশিষ্টাংশ ব্যবহার করে স্বতন্ত্রভাবে উপস্থাপন করতে ব্যবহার করতে পারি । 21 নিন:
২১ এর চেয়ে কম 30, সুতরাং আমরা 2, 3 এবং 5 দ্বারা পরিবর্তনের পরে ফলাফলগুলি ব্যবহার করে এটি উপস্থাপন করতে পারি (অর্থাত্ 2, 3, এবং 5 দ্বারা পূর্ণসংখ্যার পরে অবশিষ্ট)
আমরা নিম্নলিখিত সংখ্যার অনুক্রমের সাথে 21 চিহ্নিত করব:
21 ~ {21 মড 2, 21 মড 3, 21 মড 5} = {1, 0, 1}
এবং তাই আমাদের আরএনএস সিস্টেমে "21" এর পরিবর্তে আমরা {1,0,1} ব্যবহার করব}
সাধারণভাবে একটি পূর্ণসংখ্যার এন দেওয়া হয় , আমরা n কে { n মড 2, ..., n মোড পি_ কে represent হিসাবে প্রতিনিধিত্ব করি যেখানে পি_ কে সবচেয়ে ছোট প্রাইম যেমন এন সমস্ত প্রাইমারের পণ্যের চেয়ে পি_ কে কম বা সমান ।
আরেকটি উদাহরণ হিসাবে বলুন যে আমাদের 3412 আছে We আমাদের এখানে 2,3,5,7,11,13 ব্যবহার করা দরকার কারণ এটি 2*3*5*7*11*13=30030
যখন 2*3*5*7*11=2310
খুব ছোট।
3412 ~ {3412 মড 2, 3412 মড 3, 3412, 5 মড, ..., 3412 মড 13} = {0, 1, 2, 3, 2, 6}
আপনি লক্ষ্য করেছেন যে এই সিস্টেমটি ব্যবহার করে আমরা তুলনামূলকভাবে বেদাহীনভাবে খুব বড় সংখ্যক প্রতিনিধিত্ব করতে পারি। , 1, 2, 3, 4, 5, 6, 7, 8, ...} অবশিষ্টাংশগুলি ব্যবহার করে আমরা 2,6,30, 210, 2310, 30030, 510510, 9699690 ... to পর্যন্ত সংখ্যা উপস্থাপন করতে পারি ... যথাক্রমে। ( এখানে সিরিজটি দেওয়া হয়েছে )
আমাদের কাজ
আমরা এই সংशेषগুলি +, - এবং * প্রচুর সংখ্যক সম্পাদন করতে ব্যবহার করব। আমি নীচে এই প্রক্রিয়াগুলি বর্ণনা করব। আপাতত এখানে ইনপুট এবং আউটপুট চশমা রয়েছে।
ইনপুট
স্টিডিন বা ফাংশন আর্গুমেন্টের মাধ্যমে আপনাকে দুটি (সম্ভাব্য খুব বড়) নম্বর দেওয়া হবে। তাদের বেস 10 অঙ্কের স্ট্রিং হিসাবে দেওয়া হবে।
সমস্যাটি আরও রূপরেখা দেওয়ার উদ্দেশ্যে, আমরা প্রথম ইনপুট n
এবং দ্বিতীয়টিকে কল করি m
। এন> মি> = 0 ধরে নিন ।
এছাড়াও আপনি দেওয়া হবে +
বা -
বা *
অপারেশন ইঙ্গিত সম্পাদন করতে।
আউটপুট
এক্স একটি পূর্ণসংখ্যা হতে দিন । আমরা [ব্যবহার করবে এক্স ] RNS প্রতিনিধিত্বের উপরে বর্ণিত উল্লেখ করতে এক্স ।
আপনি আউটপুট হয় [n] <operator> [m] = [result]
আরএনএসে কীভাবে অপারেশন করবেন
এই অপারেশনগুলি তুলনামূলকভাবে সহজ। আরএনএস নোটেশনে দুটি নম্বর দেওয়া, যোগ করতে, বিয়োগ করতে বা তাদের গুণ করতে, প্রদত্ত ক্রিয়াকলাপগুলি উপাদান-ভিত্তিতে কেবল সম্পাদন করুন এবং তারপরে মডুলাসটি নিন।
অর্থাত
{1, 2, 3} + {1, 1, 4} = {(1 + 1) মোড 2, (2 + 1) মোড 3, (3 + 4) মোড 5} = {0, 0, 2}
মনে রাখবেন যে দুটি পৃথক সংখ্যার প্রতিনিধিত্ব করতে ব্যবহৃত অবশিষ্টাংশের সংখ্যা যদি একই না হয়, অপারেশন সম্পাদন করার সময়, আপনাকে "সংক্ষিপ্ত" সংখ্যাটি প্রসারিত করতে হবে যাতে এতে একই সংখ্যার অবশিষ্টাংশ থাকে। এটি একই প্রক্রিয়া অনুসরণ করে। উদাহরণস্বরূপ পরীক্ষার কেসগুলি দেখুন।
ফলাফলের জন্য যদি ইনপুটের চেয়ে আরও বেশি অবশিষ্টাংশের প্রয়োজন হয় তবে একই হয়। তারপরে উভয় ইনপুটগুলি "বর্ধিত" করা দরকার।
গুরুত্বপূর্ণ বিশদ
আমরা এখানে বড় সংখ্যার সাথে ডিল করব, তবে নির্বিচারে বড় নয়। আমরা প্রথম 100 টি প্রাইমের পণ্য পর্যন্ত সংখ্যার জন্য দায়বদ্ধ (নীচে দেখুন)। এই লক্ষ্যে, আপনাকে বিনামূল্যে প্রথম 100 টি প্রাইম দেওয়া হয় (কোনও বাইট ব্যয় নেই) । আপনি এগুলিকে
p
ডাকাতে পারেন এমন একটি অ্যারে বা আপনার ভাষার প্রতিমূর্তিযুক্ত কিছুতে আটকে রাখতে পারেন এবং তারপরে আপনার চূড়ান্ত মোট থেকে এই অ্যারেটি শুরু করতে ব্যবহৃত বাইটের সংখ্যা বিয়োগ করতে পারেন। অবশ্যই এটির অর্থ হ'ল এগুলি হার্ড-কোডড হতে পারে বা এগুলি উত্পন্ন করতে আপনি একটি বিল্ট-ইন ব্যবহার করতে পারেন।যদি কারও কারণে এটি আপনার ভাষায় ব্যবহৃত ডিফল্ট পূর্ণসংখ্যা উপস্থাপনা। ওটা দারুন.
আপনার ভাষার ডিফল্ট না হলে আপনি কোনও সালিশী যথার্থ পূর্ণসংখ্যার প্রকার ব্যবহার করতে পারবেন না। যদি এটি ডিফল্ট হয় তবে আপনি এটি পূর্ণসংখ্যার সঞ্চয় করতে ব্যবহার করতে পারবেন না যা সাধারণত b৪ বিটে ফিট হয় না।
স্পষ্টত, প্রতিটি পূর্ণসংখ্যার সর্বদা সম্ভব কয়েকটি সংখ্যক অবশিষ্টাংশের সাথে প্রতিনিধিত্ব করা হবে। এটি উভয় ইনপুট এবং আউটপুট জন্য যায়।
আমি মনে করি অন্যান্য চশমা এটির প্রতিরোধ করা উচিত, তবে অপ্রয়োজনীয় হতে পারে: আপনি ইনপুটগুলিতে প্রদত্ত ক্রিয়াকলাপটি সম্পাদন করতে পারবেন না এবং তারপরে আরএনএস এবং তারপরে আউটপুটগুলিতে সবকিছু পরিবর্তন করতে পারেন। আউটপুট উত্পাদন করতে আপনাকে অবশ্যই ইনপুটগুলি আরএনএসে পরিবর্তন করতে হবে এবং তারপরে ক্রিয়াকলাপ সম্পাদন করতে হবে।
পরীক্ষার মামলা
ইনপুট:
n = 10
m = 4
+
আউটপুট:
{ 0, 1, 0 } + { 0, 1 } = { 0, 2, 4 }
ব্যাখ্যা:
প্রথমে প্রতিটি নম্বরটিকে উপরে বর্ণিত হিসাবে তার আরএনএস উপস্থাপনায় পরিবর্তন করুন:
10 ~ {0,1,0}
এবং 4 ~ {0,1}
। লক্ষ্য করুন যে আমরা যখন উপাদান-যুক্ত সংযোজন করতে চাই তখন এর 10
চেয়ে আরও বেশি উপাদান রয়েছে 4
। সুতরাং আমাদের সংক্ষিপ্ত সংখ্যাটি "প্রসারিত" করতে হবে। সুতরাং আমরা সংক্ষেপে লিখব 4 ~ {0,1} --> {0,1, 4 mod 5} = {0,1,4}
। এখন আমরা সংযোজন নিয়ে এগিয়ে যাব এবং তারপরে মডিউলটি নিই।
- ইনপুট
n=28
m=18
+
আউটপুট:
[ 0, 1, 3 ] + [0, 0, 3 ] = [ 0, 1, 1, 4 ]
- ইনপুট (আমি কীবোর্ডে আমার মুখ জালাই করছি)
n=1231725471982371298419823012819231982571923
m=1288488183
*
আউটপুট (পাঠযোগ্যতার জন্য পৃথক লাইনে বিভক্ত):
[1, 2, 3, 6, 2, 10, 2, 1, 12, 16, 7, 15, 34, 29, 31, 5, 55, 32, 66, 61, 3, 76, 52, 14, 65, 44, 99, 57 ]
*
[1, 0, 3, 3, 4, 8, 9, 10, 8, 0 ]
=
[1, 0, 4, 4, 8, 2, 1, 10, 4, 0, 17, 7, 27, 21, 44, 51, 56, 9, 6, 9, 12, 0, 52, 36, 43, 68, 99, 24, 96, 39, 96, 66, 125]
n
28 প্রাইম প্রয়োজন। m
প্রয়োজন 10. n*m
প্রয়োজন 33।
- ইনপুট
n=8709668761379269784034173446876636639594408083936553641753483991897255703964943107588335040121154680170867105541177741204814011615930342030904704147856733048115934632145172739949220591246493529224396454328521288726490
m=1699412683745170450115957274739962577420086093042490863793456500767137147999161679589295549397604032154933975242548831536518655879433595016
-
আউটপুট:
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 509]
-
[0, 2, 1, 6, 1, 12, 11, 18, 14, 28, 21, 36, 37, 42, 16, 52, 41, 60, 16, 70, 49, 78, 80, 88, 49, 100, 13, 106, 4, 112, 68, 130, 36, 138, 37, 150, 0, 162, 8, 172, 163, 180, 18, 192, 129, 198, 135, 222, 78, 228, 90, 238, 57, 250, 36, 262, 87, 270, 206, 280, 193, 292, 253, 310, 224, 316, 57, 336, 48, 348]
=
[0, 1, 4, 1, 10, 1, 6, 1, 9, 1, 10, 1, 4, 1, 31, 1, 18, 1, 51, 1, 24, 1, 3, 1, 48, 1, 90, 1, 105, 1, 59, 1, 101, 1, 112, 1, 0, 1, 159, 1, 16, 1, 173, 1, 68, 1, 76, 1, 149, 1, 143, 1, 184, 1, 221, 1, 182, 1, 71, 1, 90, 1, 54, 1, 89, 1, 274, 1, 299, 1, 266, 1, 228, 1, 340, 1, 170, 1, 107, 1, 340, 1, 88, 1, 157, 1, 143, 1, 22, 1, 22, 1, 58, 1, 296, 1, 371, 1, 140]
n
100 প্রাইম ব্যবহার করে। m
70 প্রাইম ব্যবহার করে। n-m
99 টি প্রাইম ব্যবহার করে।
আমি এগুলি ChineseRem
জিএপি-তে চীনা অনুস্মারক উপপাদ্যের অন্তর্নির্মিত প্রয়োগটি ব্যবহার করে পরীক্ষা করেছি (যা মূলত আরএনএস সংখ্যা নিয়ে থাকে এবং তাদেরকে দশগুণকে পরিবর্তিত করে)। আমি বিশ্বাস করি সেগুলি সঠিক। যদি কিছু ফিশ করে মনে হয় তবে দয়া করে আমাকে জানান।
যারা যত্নশীল তাদের জন্য প্রথম 100 টি প্রাইমের পণ্য হ'ল:
471193079990618495316248783476026042202057477340967552018863483961641533584503
422120528925670554468197243910409777715799180438028421831503871944494399049257
9030720635990538452312528339864352999310398481791730017201031090
প্রদত্ত সিস্টেমটি (এবং 100 টি প্রাথমিক সীমাবদ্ধতা) ব্যবহার করে আমরা প্রতিনিধিত্ব করতে পারি এমন সর্বাধিক সংখ্যার চেয়ে এই সংখ্যাটি 1 টি বড়।
(a,b,o)=>a.map((v,i)=>eval(v+o+b[i]))
ES6 এ উদাহরণস্বরূপ। আমি মনে করি সবচেয়ে শক্ত অংশটি সম্ভবত নির্বিচারে নির্ভুলতা পাটিগণিত ব্যবহার না করে ফলাফলকে উপস্থাপনের জন্য প্রয়োজনীয় প্রাইম সংখ্যাটি সন্ধান করছে, যদিও পরবর্তী সময়ে আরএনএসে রূপান্তরটি একেবারেই তুচ্ছ নয়।
1234,1234,+
) এর মতো ইনপুট পেতে পারি ?