के लिए "आधार रूपांतरण" को तेज़ी से बढ़ाकर मैं एक बड़े पूर्णांक (32-बिट शब्दों में विभाजित) से क्रमपरिवर्तन उत्पन्न करने के लिए आधार-रूपांतरण एल्गोरिदम का उपयोग कर रहा हूं।बड़े पूर्णांक
मैं इस के लिए एक अपेक्षाकृत मानक एल्गोरिथ्म का उपयोग करें:
/* N = count,K is permutation index (0..N!-1) A[N] contains 0..N-1 */
i = 0;
while (N > 1) {
swap A[i] and A[i+(k%N)]
k = k/N
N = N - 1
i = i + 1
}
दुर्भाग्य से, फूट डालो और सापेक्ष प्रत्येक यात्रा कहते हैं, विशेष रूप से बड़ी पूर्णांकों में जाने - लेकिन, ऐसा लगता है मैं सिर्फ गुणा इस्तेमाल कर सकते हैं!
/* As before, N is count, K is index, A[N] contains 0..N-1 */
/* Split is arbitrarily 128 (bits), for my current choice of N */
/* "Adjust" is precalculated: (1 << Split)/(N!) */
a = k*Adjust; /* a can be treated as a fixed point fraction */
i = 0;
while (N > 1) {
a = a*N;
index = a >> Split;
a = a & ((1 << Split) - 1); /* actually, just zeroing a register */
swap A[i] and A[i+index]
N = N - 1
i = i + 1
}
यह अच्छा है, लेकिन बड़े पूर्णांक गुणा करने से अभी भी सुस्त है।
प्रश्न 1:
क्या यह तेजी से करने का कोई तरीका है?
ईजी। चूंकि मुझे पता है कि एन * (एन -1) 2^32 से कम है, क्या मैं उन संख्याओं को एक शब्द से बाहर खींच सकता हूं, और 'बचे हुए' में विलय कर सकता हूं?
या, क्या एक समय में एक व्यक्ति को बाहर निकालने के लिए एक दयनीय डीकोडर को संशोधित करने का कोई तरीका है?
प्रश्न 2:
जिज्ञासा के लिए - यदि मैं समायोजन के बिना किसी संख्या को आधार 10 में परिवर्तित करने के लिए गुणा का उपयोग करता हूं, तो परिणाम (10^अंक/2^शिफ्ट) से गुणा किया जाता है। दशमलव अंकों के साथ काम कर रहे इस कारक को हटाने का कोई मुश्किल तरीका है? समायोजन कारक के साथ भी, ऐसा लगता है कि यह तेज़ होगा - मानक पुस्तकालय इस बनाम विभाजन और मोड का उपयोग क्यों नहीं करेंगे?
मैं आपके दूसरे एल्गोरिदम का एहसास नहीं कर सकता। –
@ ग्रेग्स - कृपया मुझे बताएं कि क्या आपको लगता है कि कोई समस्या है - सिद्धांत यह है कि यह बाएं (एमएसबी) के मूल्यों को बहु/मास्क बनाम दाएं (एलएसबी) बनाम मोड/डिवाइड के साथ हटा देता है। –