যৌক্তিক সংখ্যার দ্বারাই XOR


19

ভূমিকা

0 এবং 1 এর মধ্যে প্রতিটি যৌক্তিক সংখ্যা বিটগুলির পর্যায়ক্রমিক ক্রম হিসাবে উপস্থাপিত হতে পারে। উদাহরণস্বরূপ, 11/40 এর বাইনারি উপস্থাপনাটি

0.010 0011 0011 0011 ...

যেখানে 0011অংশটি অনির্দিষ্টকালের জন্য পুনরাবৃত্তি করে। এই প্রতিনিধিত্ব সন্ধানের একটি উপায় নিম্নলিখিত। দিয়ে শুরু করুন R = 11/40 , তারপর বারবার এটা বহুগুণে বৃদ্ধি করবেন এবং ভগ্ন অংশ নিতে, রেকর্ডিং যখন এটি উপরে 1. যায় যখন এর মান পুনরাবৃত্তি, আপনি জানেন আপনি একটি লুপ লিখে ফেলেছেন।

1. r = 11/40
2. 2*r = 11/20 < 1   ->  next bit is 0, r = 11/20
3. 2*r = 11/10 >= 1  ->  next bit is 1, r = 2*r - 1 = 1/10
4. 2*r = 1/5 < 1     ->  next bit is 0, r = 1/5
5. 2*r = 2/5 < 1     ->  next bit is 0, r = 2/5
6. 2*r = 4/5 < 1     ->  next bit is 0, r = 4/5
7. 2*r = 8/5 >= 1    ->  next bit is 1, r = 2*r - 1 = 3/5
8. 2*r = 6/5 >= 1    ->  next bit is 1, r = 2*r - 1 = 1/5, same as in 4.
   The loop 5. -> 6. -> 7. -> 8. now repeats.

বাইনারি স্ট্রিং থেকে 11/40 এ ফিরে যেতে, আপনি সূত্রটি ব্যবহার করতে পারেন

(int(prefix) + int(suffix)/(2^len(suffix) - 1)) / 2^len(prefix)

prefixপ্রাথমিক অংশটি কোথায় 010, suffixপুনরাবৃত্তিকারী অংশ 0011, এবং intবাইনারি স্ট্রিংটিকে পূর্ণসংখ্যায় রূপান্তর করে।

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

কিছু যুক্তিযুক্ত সংখ্যার জন্য দুটি বাইনারি উপস্থাপনা রয়েছে।

1/4 = 0.010000000...
    = 0.001111111...

তাদের মধ্যে পছন্দটি বিটওয়াইজ এক্সওরটির ফলাফলকে প্রভাবিত করতে পারে। এই ক্ষেত্রে, আমরা প্রাক্তন উপস্থাপনা ব্যবহার করি, যার অসীম 0 টি রয়েছে s

কাজটি

অর্ধ-খোলা ব্যবধানে আপনার ইনপুটগুলি দুটি যৌক্তিক সংখ্যা [0,1)। আপনার আউটপুটটি যুক্তিযুক্ত সংখ্যা হিসাবে প্রকাশিত ইনপুটগুলিতে বিটওয়াইজ এক্সওআর অপারেশনের ফল হবে shall নোট করুন যে আউটপুটটি 1 হতে পারে, যদিও ইনপুটগুলির কোনওটিই নয়।

ইনপুট এবং আউটপুট সঠিক ফরম্যাটের নমনীয়, কিন্তু প্রতিটি যুক্তিসঙ্গত দুই নম্বর পূর্ণসংখ্যার, লব ও হর (0 এবং 1 এর ব্যতিক্রম, যা হিসাবে প্রতিনিধিত্ব করা যাবে দ্বারা প্রতিনিধিত্ব করা উচিত 0এবং 1আকাঙ্ক্ষিত থাকেন)। আপনি ধরে নিতে পারেন যে ইনপুটগুলি সর্বনিম্ন শর্তে প্রকাশিত হয়েছে। আউটপুট অবশ্যই সর্বনিম্ন শর্তে প্রকাশ করা উচিত । একটি অন্তর্নির্মিত যৌক্তিক সংখ্যা প্রকারটি একটি গ্রহণযোগ্য ফর্ম্যাট, যতক্ষণ না এটি এই বিধিনিষেধকে সন্তুষ্ট করে। আপনি আপনার ভাষার দ্বারা আরোপিত পূর্ণসংখ্যার কোনও সীমা অবহেলা করতে পারেন, তবে আপনার অ্যালগরিদমটি তাত্ত্বিকভাবে সমস্ত যুক্তিযুক্ত সংখ্যার জন্য কাজ করা উচিত।

সর্বনিম্ন বাইট গণনা জিতেছে। স্ট্যান্ডার্ড বিধি প্রযোজ্য।

উদাহরণ

ইনপুটগুলি 11/40 এবং 3/7 বিবেচনা করুন। পাইপ দ্বারা পুনরাবৃত্তি অংশগুলি সীমিত করে আমরা তাদের উপস্থাপনাগুলি একে অপরের উপরে লিখি |। তারপরে আমরা সমান দৈর্ঘ্যের অংশগুলি পুনরাবৃত্তি করি এবং তাদের এবং তার আগে অংশগুলিতে বিটওয়াইজ এক্সওআর প্রয়োগ করি।

11/40 = 0. 0 1 0|0 0 1 1|0 0 1 1|0 0 1 1|0 0 1 1|0 0 1 1|0 0 1 1|0 0 1 ...
3/7   = 0.|0 1 1|0 1 1|0 1 1|0 1 1|0 1 1|0 1 1|0 1 1|0 1 1|0 1 1|0 1 1|...
     -> 0. 0 0 1|0 1 0 1 1 1 1 0 1 0 0 0|0 1 0 1 1 1 1 0 1 0 0 0|0 1 0 ...

ফলাফল যুক্তিযুক্ত সংখ্যা 89/520 হয়।

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

0 0 -> 0
1/2 1/2 -> 0
1/2 1/4 -> 3/4
1/3 2/3 -> 1
1/2 3/4 -> 1/4
5/8 1/3 -> 23/24
1/3 1/5 -> 2/5
15/16 3/19 -> 257/304
15/16 257/304 -> 3/19
3/7 11/40 -> 89/520
5/32 17/24 -> 59/96
16/29 16/39 -> 621001733121535520/696556744961512799

আমাদের সর্বাধিক সময়কাল সমর্থন করা প্রয়োজন?
নীল

@ নীল আপনি কী ভাবেন যে এমন সর্বাধিক বিদ্যমান?
orlp

3
দ্রষ্টব্য: কিছু সংখ্যার দুটি বাইনারি সম্প্রসারণ থাকে, যাহা সেই সংখ্যাগুলি যেখানে শেষ সময়কালের দৈর্ঘ্য এক হয়। এটি উপরের সমস্যার সংজ্ঞায় অন্তর্নিহিত যে আমাদের অবশ্যই এই উপস্থাপনাটি শেষ করতে হবে000...যা এই ক্ষেত্রেশেষ হয়(যা আমরা যদি আলগোরিদমটি ব্যবহার করি তবে এটিই আমরা পাইr)। উদাহরণস্বরূপ, ক্ষেত্রে5/8, 1/3আমরা পাই23/24কারণ আমরা এর0.101000...জন্যসম্প্রসারণটি বেছে নিই5/8। যদি আমরা পরিবর্তে0.10011111...হিসাবেবেছে নিই5/8, এক্সওর হওয়ার পরে ফলাফলটি হয়ে যায়19/24, তাই এটি ভুল। উইকিপিডিয়া
জেপ্পে স্টিগ নীলসেন

3
@ জেপ্পস্টিগনিয়েলসন ড্যাম ... এর অর্থ নিয়মিত এক্সওআর এর বিপরীতে (a ^ b) ^ b == aনেই। যেমন (19/24 ^ 1/3) ^ 1/3 != 19/24। এটি আমাকে এই সম্পর্কে বেশ খানিকটা উত্তেজনা হারাতে
বাধ্য করেছে

উত্তর:


3

পাইথন 3, 193 164 বাইট

def x(a,b,z=0):
 l=[]
 while(a,b)not in l:l+=[(a,b)];z=2*z|(a<.5)^(b<.5);a=a*2%1;b=b*2%1
 p=l.index((a,b));P=len(l)-p
 return((z>>P)+z%2**P*a**0/~-2**(P or 1))/2**p

পাইথন 3 এর fractions.Fractionধরণ হিসাবে ইনপুট নেয় এবং এটির ফলাফলও দেয়।

মজার বিষয় (আপনি সহজেই এই উৎপাদিত ফাংশন ব্যবহার করে দেখাতে পারেন), যদি আপনি পরিবর্তন (a<.5)^(b<.5)করতে ((a>=.5)and(b>=.5))উপরে আপনি বাইনারি পেতে এবং দুই মূলদ সংখ্যার মধ্যে। এই কল nd(a, b)। তাহলে আমাদের আছে a + b - 2*nd(a, b) = x(a, b)!


আসলে আমার ভুল। দুঃক্ষিত! (দ্রষ্টব্য যে উত্তরের অন্তর্ভুক্ত
টিওর লিঙ্কটি

1

জাভাস্ক্রিপ্ট, 141 বাইট

(p,q,r,s)=>(h=(v,u)=>v%u?h(u,v%u):[a/u,b/u])(b=(g=x=>x%q||x%s?g((x|x/2)+x%2):x)(1),a=(o=b/(b-(b&~-b)),x=p*b/q,y=r*b/s,(x%o^y%o)+(x/o^y/o)*o))

শেষ পরীক্ষার ক্ষেত্রে (পূর্ণসংখ্যার ওভারফ্লো) কাজ করবে না। 4 সংখ্যার জন্য ইনপুট করুন p/q xor r/s, দুটি সংখ্যার সাহায্যে একটি অ্যারের আউটপুট করুন। টেস্টকেসের জন্য 0, 0, আপনার ইনপুট করা উচিত 0, 1, 0, 1

কিভাবে:

(এখানে বর্ণিত সমস্ত সংখ্যা বাইনারি আকারে রয়েছে))

  1. সর্বাধিক সংখ্যার সন্ধান করুন b, যা b = 10 ^ p - 10 ^ q (p, q are integers, p > q); and b = 0 (mod q); and b = 0 (mod s);
  2. যাক x = p * b / q, y = r * b / q; রূপান্তর p / q, r / sথেকে x / bএবং y / b;
  3. যাক o = 10 ^ (p - q) - 1; বিভক্ত x, yকরতে [x % o, x / o], [y % o, y / o]; প্রতিটি অংশের জন্য xor পান [x % o xor y % o, x / o xor y / o], এবং ফিরে যোগদান করুন (x % o xor y % o) + (x / o xor y / o) * o; হিসাবে এটি দান a;
  4. যদি a = 0, উত্তরটি 0(বা 0 / 1) হয়; অন্যথায় যাক u = gcd(a, b); উত্তরটি হ'ল (a/u)এবং (b/u)

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