চাইনিজ রিমেন্ডার উপপাদ্য


21

চীনা বাকি উপপাদ্য আমাদের বলে যে সবসময় আমরা একটি সংখ্যা যে বিভিন্ন মৌলিক মডিউল অধীনে যে কোন প্রয়োজনীয় remainders উত্পাদন করে খুঁজে পেতে পারেন। আপনার লক্ষ্য হ'ল বহুপাক্ষিক সময়ে এই জাতীয় সংখ্যার আউটপুট দেওয়ার জন্য কোড লিখুন। সংক্ষিপ্ততম কোড জিতেছে।

উদাহরণস্বরূপ, বলুন আমাদের এই সীমাবদ্ধতা দেওয়া হয়েছে ( %মোডের প্রতিনিধিত্ব করে):

n % 7  == 2
n % 5  == 4
n % 11 == 0

একটি সমাধান হল n=44। প্রথম বাধ্যতা কারণ সন্তুষ্ট হয় 44 = 6*7 + 2, এবং তাই 44বাকি রয়েছে 2যখন দ্বারা বিভক্ত 7, এবং এইভাবে 44 % 7 == 2। অন্য দুটি সীমাবদ্ধতা এছাড়াও পূরণ করা হয়। অন্যান্য সমাধান রয়েছে যেমন, n=814এবং n=-341

ইনপুট

জোড়াগুলির একটি খালি খালি তালিকা (p_i,a_i), যেখানে প্রতিটি মডুলাস p_iএকটি পৃথক প্রধান এবং প্রতিটি লক্ষ্য a_iপরিসরের একটি প্রাকৃতিক সংখ্যা 0 <= a_i < p_i। আপনি যে কোনও আকারে সুবিধাজনক হিসাবে ইনপুট নিতে পারেন; এটি আসলে জোড়ের তালিকা হতে হবে না। আপনি ধরে নিতে পারেন না যে ইনপুটটি সাজানো হয়েছে।

আউটপুট

প্রতিটি সূচকের জন্য nএমন একটি পূর্ণসংখ্যা । এটি এ জাতীয়তম মানের হতে হবে না, এবং এটি নেতিবাচক হতে পারে।n % p_i == a_ii

বহুপদী সময় সীমাবদ্ধতা

সস্তা সমাধান যে শুধু চেষ্টা প্রতিরোধ করার জন্য n=0, n=1, n=2, ইত্যাদি আপনার কোড বহুপদী সময় চালানো উচিত নয় ইনপুট দৈর্ঘ্য । নোট করুন যে ইনপুটটিতে কোনও সংখ্যার mদৈর্ঘ্য রয়েছে Θ(log m), সুতরাং mএটির দৈর্ঘ্যে নিজেই বহুপদী নয়। এর অর্থ হ'ল আপনি mকোনও অপারেশন mসময় পর্যন্ত গণনা করতে বা করতে পারবেন না তবে আপনি মানগুলিতে পাটিগণিত অপারেশনগুলি গণনা করতে পারেন।

আপনি এটিকে ঘিরে ধরার জন্য অ্যানেরির মতো অক্ষম ইনপুট ফর্ম্যাটটি ব্যবহার করতে পারেন।

অন্যান্য নিষিদ্ধ

নিম্নলিখিতগুলি করার জন্য বিল্ট-ইনগুলি অনুমোদিত নয়: চীনা অনুস্মারক উপপাদ্যটি প্রয়োগ করুন, সমীকরণগুলি সমাধান করুন বা ফ্যাক্টর সংখ্যাগুলি।

আপনি বিল্ট-ইনগুলি মোডগুলি সন্ধান করতে এবং মডুলার সংযোজন, বিয়োগফল, গুণ এবং ক্ষয়ক্ষতি (প্রাকৃতিক-সংখ্যাযুক্ত হিসাবে) করতে পারেন। আপনি মডিউলার ইনভার্স, বিভাগ এবং অর্ডার সন্ধান সহ অন্যান্য অন্তর্নির্মিত মডিউলার অপারেশনগুলি ব্যবহার করতে পারবেন না

পরীক্ষার মামলা

এগুলি ক্ষুদ্রতম অ-নেতিবাচক সমাধান দেয়। আপনার উত্তর ভিন্ন হতে পারে। আপনার আউটপুট প্রতিটি প্রতিবন্ধকতা সন্তুষ্ট করে যদি সরাসরি পরীক্ষা করে থাকেন তবে এটি সম্ভবত আরও ভাল।

[(5, 3)] 
3

[(7, 2), (5, 4), (11, 0)]
44

[(5, 1), (73, 4), (59, 30), (701, 53), (139, 112)]
1770977011

[(982451653, 778102454), (452930477, 133039003)]
68121500720666070

বিভাজন কেন?
jimmy23013

@ ব্যবহারকারী23013 কোনও মডিউলার বিভাজন নেই, কারণ এটি মূলত বিপরীতমুখী।
xnor

ম্যাট্রিক্স বিপরীকরণ কি সমীকরণ সমাধান হিসাবে গণনা করা হয়?
flawr

@ ফ্লোয়ার: আমিও তাই ভাবব।
অ্যালেক্স এ।

@ এক্সনর: আপনার কী মনে হয়? এবং কিভাবে অপ্টিমাইজেশন ফাংশন সম্পর্কে?
flawr

উত্তর:


9

গণিত, 55 51 45

মডুলার বিপরীত নিষিদ্ধ করা হয়েছে, তবে মডিউল বিভক্তকরণ অনুমোদিত। ফারম্যাট এর ছোট উপপাদ্য দ্বারা n^(-1) % p == n^(p-2) % p,।

(PowerMod[x=1##&@@#/#,#-2,#]x).#2&@@Thread@#&

উদাহরণ:

In[1]:= f = (PowerMod[x=1##&@@#/#,#-2,#]x).#2&@@Thread@#&;

In[2]:= f[{{5, 3}}]

Out[2]= 3

In[3]:= f[{{7, 2}, {5, 4}, {11, 0}}]

Out[3]= 1584

In[4]:= f[{{5, 1}, {73, 4}, {59, 30}, {701, 53}, {139, 112}}]

Out[4]= 142360350966

শুধুই মজার জন্য:

ChineseRemainder@@Reverse@Thread@#&

1
আপনি অভ্যন্তরীণতম ফাংশনের আর্গুমেন্টের ক্রমটি অদলবদল করে একটি বাইট সংরক্ষণ করতে পারেন, যেমন আপনি ব্যবহার করতে পারেন PowerMod[#2,#-2,#]এবং আমিও মনে করি না যে ফাংশনটির নামকরণের প্রয়োজন আছে, এটি 48 এ নামিয়ে আনতে হবে।
মার্টিন ইন্ডার

হ্যাঁ, নামবিহীন ফাংশনগুলি ঠিক আছে।
xnor

6

পাইথন 2, 165 101 99 98 85 বাইট

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

l=input();x=reduce(lambda a,b:a*b[0],l,1)
print sum(x/a*b*pow(x/a,a-2,a)for a,b in l)

[(5, 3)]
3
[(7, 2), (5, 4), (11, 0)]
1584
[(5, 1), (73, 4), (59, 30), (701, 53), (139, 112)]
142360350966

1
আপনি আগে স্থান সরাতে পারেন for
isaacg

1
x/a*b*pow(x/a,a-2,a)for a,b in lকাজ করা উচিত.
অস্থিরতা

দুর্দান্ত পয়েন্ট! আমি সেখানে স্পষ্টত অপ্রয়োজনীয়তা থেকে মুক্তি পাওয়ার চেষ্টা করছিলাম তবে ভুলে গিয়েছিলাম যে আমি কেবল প্যাকটি খুলতে পারি।
উরি গ্রান্ট

4

পাইথ, 40 37 36 29

M*G.^G-H2Hsm*edg/u*GhHQ1hdhdQ

আলেফাল্ফাকে ধন্যবাদ, ফার্মের ছোট্ট উপপাদ্য ব্যবহার করুন। এই সূত্রটি ব্যবহার করে গণনা করা ।


3

রুবি, 129

ভাল, কমরেডস, মনে হচ্ছে রুবির সমাধানগুলি দীর্ঘতর হওয়া উচিত কারণ ওপেনএসএল লাইব্রেরি লোড করা এবং ওপেনএসএসএল :: বিএন-তে রূপান্তর করা ছাড়া মডুলার এক্সপেনসিয়েশন পাওয়া যায় না। তবুও, এটি লিখতে মজা পান:

require("openssl")
z=eval(gets)
x=1
z.map{|a,b|x*=a}
s=0
z.map{|a,b|e=a.to_bn;s+=(x/a).to_bn.mod_exp(e-2,e).to_i*b*x/a}
puts(s)

যখন কলিং আপনি ডান বন্ধনী প্রয়োজন হবে না require, evalঅথবা puts
টুটম্যান

2

পাইথন 2, 61

n=P=1
for p,a in input():n+=P*(a-n)*pow(P,p-2,p);P*=p
print n

এটি অন্যান্য উত্তর ব্যবহার করে এমন পণ্য নির্মাণের বিভিন্নতা নিয়োগ করে ।

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

সুতরাং, আমাদের কেবলমাত্র এর ডান একাধিক যোগ করে nসন্তুষ্ট করার জন্য পরিবর্তন করতে হবে । আমরা সহগের জন্য সমাধান করি :n%p == aPc

(n + P*c) % p == a

এর জন্য এটি প্রয়োজন c = (a-n) * P^(-1), যেখানে বিপরীতটি মডুলো নেওয়া হয় p। অন্যরা যেমন খেয়াল করেছে, বিপরীতটি ফারমেটের লিটল উপপাদ্য হিসাবে গণনা করতে পারে P^(-1) = pow(P,p-2,p)। সুতরাং, c = (a-n) * pow(P,p-2,p)আর আমরা আপডেট nদ্বারা n+= P * (a-n) * pow(P,p-2,p)


1

হাস্কেল, 68 100 বাইট

f l=sum[p#(m-2)*n*p|(m,n)<-l,let a#0=1;a#n=(a#div n 2)^2*a^mod n 2`mod`m;p=product(map fst l)`div`m]

ব্যবহার: f [(5,1), (73,4), (59,30), (701,53), (139,112)]-> 142360350966

সম্পাদনা করুন: এখন দ্রুত "পাওয়ার / মোড" ফাংশন সহ। ইনবিল্ট পাওয়ার ফাংশন সহ পুরানো সংস্করণ (68 বাইট):

f l=sum[l#m^(m-2)`mod`m*n*l#m|(m,n)<-l]
l#m=product(map fst l)`div`m

আমি সন্দেহ করি যে আপনার পাওয়ার-মোডের প্রয়োগটি বহু-সময় নয়, কারণ মোডের পূর্বে এক্সপেনেন্ট একটি বিশাল সংখ্যক উত্পাদন করে। আপনি কি সর্বশেষ পরীক্ষার কেসটি দেখেছেন?
xnor

@ এক্সনর: আমার 2 জিবি মেশিনে কয়েক সেকেন্ড পরে শেষ পরীক্ষার স্মৃতি মেমরির বাইরে চলে গেছে। আমি একটি দ্রুত শক্তি / মোড ফাংশন যুক্ত করেছি।
নিমি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.