পূর্ণসংখ্যা করতে ডি ব্রুইজন ক্রম ব্যবহার করে


11

শন অ্যান্ডারসন প্রকাশিত বিট হ্যাক twiddling এরিক কোল এর এলগরিদম ধারণকারী এটি একটি এর -বিট পূর্ণসংখ্যা মধ্যে সংখ্যাবৃদ্ধি এবং লুকআপ অপারেশন।log2vNvO(lg(N))

অ্যালগরিদম ডি ব্রুইজন ক্রম থেকে একটি "যাদু" সংখ্যার উপর নির্ভর করে। কেউ কি এখানে ব্যবহার করা অনুক্রমের মৌলিক গণিতের বৈশিষ্ট্য ব্যাখ্যা করতে পারে?

uint32_t v; // find the log base 2 of 32-bit v
int r;      // result goes here

static const int MultiplyDeBruijnBitPosition[32] = 
{
  0, 9, 1, 10, 13, 21, 2, 29, 11, 14, 16, 18, 22, 25, 3, 30,
  8, 12, 20, 28, 15, 17, 24, 7, 19, 27, 23, 6, 26, 5, 4, 31
};

v |= v >> 1; // first round down to one less than a power of 2 
v |= v >> 2;
v |= v >> 4;
v |= v >> 8;
v |= v >> 16;

r = MultiplyDeBruijnBitPosition[(uint32_t)(v * 0x07C4ACDDU) >> 27];

2
ধারণাটি এই পেপার থেকে এসেছে সুপারটেক.কমসিল.মিট.ইডু / পেপারস / ডেব্রুইজন.পিডিএফ । আকারের একটি ডি Brujn ক্রম আকারের সব বিট স্ট্রিং প্রতিনিধিত্ব করতে একটি উপায় খুব সংক্ষেপে: প্রতিটি সম্ভাব্য স্ট্রিং একটি সংলগ্ন subsequence যেমন ঠিক একবার মনে হচ্ছে। সুতরাং আপনি যদি ডি ব্রুইজন ক্রমটি বিট দ্বারা স্থানান্তর করেন এবং শেষ বিটগুলি পড়ে থাকেন তবে জন্য আপনার একটি অনন্য শনাক্তকারী রয়েছে । কে এন 2 কে কে এন2kkn2kkn
সাশো নিকোলভ

1
উপায় দ্বারা এটি কেবল গণনা করে ; এবং লিখিত হিসাবে এটি কেবল 32-বিট পূর্ণসংখ্যার জন্য কাজ করে। log2v
সাশো নিকোলভ

1
@ সাশো একটি উত্তরে পরিণত?
যুবাল ফিল্মাস 10

@ সাশোনিকোলভ ধন্যবাদ, প্রশ্নের সিলিং ফাংশন যুক্ত করেছেন
ইয়ুরি

উত্তর:


9

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

শিফট এবং বা-এর ক্রম যা প্রথমে প্রদর্শিত হয় তাতে নেতৃস্থানীয় 1-বিট এর সর্বনিম্ন তাত্পর্যপূর্ণ বিট পর্যন্ত প্রচারের ফাংশন রয়েছে । সংখ্যাগতভাবে, এটি আপনাকে ।2 লগ 2 ভি - 1v2log2v1

মজার অংশটি হ'ল ডি ব্রুইজন ট্রিক, যা লিজারসন, প্রোকপ এবং র্যান্ডাল (স্পষ্টত এমআইটি অধ্যাপকরা বিট হ্যাক করতে সময় ব্যয় করেছেন :) এর এই পেপার থেকে এসেছে ) ডি ব্রুইজন ক্রমগুলি সম্পর্কে আপনার যা জানা দরকার তা হ'ল তারা প্রদত্ত দৈর্ঘ্যের সমস্ত সম্ভাব্য অনুক্রমকে এমনভাবে উপস্থাপন করুন যা যতটা সম্ভব সংকুচিত হয়। অবিকল, বর্ণমালা over over এর উপরে একটি ডি ব্রুজান ক্রম দৈর্ঘ্য বাইনারি স্ট্রিং যেমন যে প্রতিটি দৈর্ঘ্যের বাইনারি স্ট্রিংটি ঠিক একবার সংলগ্ন সাবস্ট্রিং হিসাবে প্রদর্শিত হয় (চারপাশে মোড়ানো অনুমোদিত)। কারণ এই দরকারী যে আপনি একটি সংখ্যা আছে যদি হয় যার বিট উপস্থাপনা ডি Bruijn ক্রম (সঙ্গে paddeds 2 কে কে এক্স কে কে 2 আই এক্স আই আই < কে{0,1}s2kkXkশূন্য), তারপর উপরের এর বিট অনন্যভাবে চেনা (যতদিনk2iXii<k ) থাকে।


3
i2ii2i11

v

5

c

  • c

    11111011100110101100010100100000
    
  • 2ici=0,1,...,31

    00000100011001010011101011011111
    00001111101110011010110001010010
    
  • (2i+11)ci=0,1,...,31

    00000111110001001010110011011101  (07C4ACDD)
    10000111110001001010110011011101
    01111000001110110101001100100011
    11111000001110110101001100100011
    

দ্রুত পরীক্ষার উপর ভিত্তি করে কিছু পর্যবেক্ষণ (আশা করি আমি এগুলি সঠিকভাবে পেয়েছি):

  1. টাইপ এক্স এর 65536 পূর্ণসংখ্যা রয়েছে।

  2. টাইপ এক্স + ওয়াইয়ের 4096 পূর্ণসংখ্যা রয়েছে These এটি যথাযথভাবে টাইপ এক্স এর পূর্ণসংখ্যা যা '0000 ...' সিকোয়েন্স দিয়ে শুরু হয়

    • অন্তর্দৃষ্টি: নেতৃস্থানীয় জিরো সঙ্গে, আবর্তন = স্থানান্তর?
  3. টাইপ এক্স + ওয়াই + জেডের 256 পূর্ণসংখ্যা রয়েছে These

    • অন্তর্দৃষ্টি: ??
  4. টাইপ ওয়াইয়ের সমস্ত সংখ্যার এক্স টাইপও হয় type

  5. তবে, টাইপ জেডের 768 পূর্ণসংখ্যা রয়েছে যা X টাইপ বা ওয়াই টাইপের নয়, এগুলি শুরু হয় '1000011111 ...', '0111100000 ...', বা '1111100000 ...' দিয়ে


1
এটিই কেবলমাত্র একমাত্র জবাব যা ডি ব্রুইজনকে 2 ^ n-1 কাজ করে 2 ^ n এর বিপরীতে, কারণ এটি কেবলমাত্র একটি স্থানান্তর is যদি কেউ উপরের # 3 এর "স্বজ্ঞাত" এ প্রসারিত করতে পারে তবে আমি এটি পছন্দ করব। এরিক কোল কীভাবে এটিকে সামনে এলো? বিচার ও ত্রুটি? অথবা আপনি 2 ^ n-1 দিয়ে গুণ করলে বিটগুলিতে আসলে কী ঘটে যায় তার কিছু বোঝার?
ফার্মারবুবি

1
  • এই ধ্রুবক কোথা থেকে আসে?

উদ্ধৃতি: "10 ডিসেম্বর, ২০০৯-এ, মার্ক ডিকিনসন দু'টির ক্ষমতার চেয়ে 2 এর পরবর্তী শক্তির চেয়ে একের কম হওয়া উচিত বলে কয়েকটি দফতর পরিচালনা করেছিলেন।" [Graphics.stanford.edu/~seander/bithacks.html]

এই পার্টিকুলার ধ্রুবকটি বাইনারি বর্ণমালার সাথে একটি অতিরিক্ত সম্পত্তি সহ একটি ডি ব্রুইজন সিকোয়েন্স। আসল অ্যালগরিদমকে এই বিশেষ ডিবি সিকোয়েন্স ছাড়া বাস্তবায়িত করা যায় বলে আমি এটিকে 'মার্ক ডিকিনসন সম্পত্তি' বলব। 2 টি অতিরিক্ত ক্রিয়াকলাপ সংযোজন করে আমরা যে কোনও সাধারণ ডিবি সিকোয়েন্স ব্যবহার করতে পারি। অপারেশন: ভি ^ = (ভি >> 1); // এমএসবি ব্যতীত সমস্ত বিট ক্যাসকেডিং বা শিফ্টের পরে সেট করুন।

  • ফলাফল (ব্রুটফোর্স)

Seq.Type | সংখ্যার পূর্ণসংখ্যা | নং ডিবিএসিক। সাথে | আবর্তন ছাড়াই | ডিকিনসন সম্পত্তি
বি (2, 3) এর সাথে 256 | 16 | 2 | 1
বি (2, 4) | 64Ki | 256 | 16 | 4
বি (2, 5) | 04 জিআই | 64Ki | 02 কি | 256
বি (2, 6) | 16Ei | 04 জিআই | 64 মী | ??

  • বিশেষ সম্পত্তি

0x7C4ACDD 2k132 কে 1 2 কে 1(mod232)32k1এখানে চিত্র বর্ণনা লিখুন2k - )1

  • ডিকিনসন সম্পত্তির সাথে ডিক্সনোগ্রাফিকভাবে ক্ষুদ্রতম বাইনারি ডি ব্রুইজন ক্রম

    [বি (২,৩): ০x1 ডি] [বি (২,৪): 0x0F2D] [বি (২,৫): 0x7 সি 4 এফডিডি] [বি (২,6): এখনও অনুসন্ধান করছেন]

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

পিএস আমি LUT নির্মাণটি কভার করি নি, যা আপনি যদি অ্যালগরিদমের কার্যকরী নীতিগুলি বুঝতে পারেন তবে সহজেই অনুমিত হয়।


শেষ পর্যন্ত পাওয়া গেছে: বি (2,6) 0x3f08a4c6acb9dbd - 'ডিকিনসন সম্পত্তি' সহ একটি 64 বিট ডি ব্রুইজ ক্রম। আমি কমপক্ষে 122K এর মতো সিক্যুয়েন্স পেয়েছি।
ফ্র্যাংজি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.