ऐसा लगता है कि यह समस्या पूर्णांक / बहुपद वर्ग के बराबर है:
1. यह ज्ञात है कि बहुपद गुणन पूर्णांक गुणन के बराबर है ।
2. जाहिर है, आपने पहले से ही बहुपद / पूर्णांक वर्ग के लिए समस्या को कम कर दिया है; इसलिए यह समस्या स्क्वेरिंग के रूप में अधिक से अधिक कठिन है।
अब मैं इस समस्या के पूर्णांक को कम करूँगा:
मान लीजिए कि आपके पास एक एल्गोरिथ्म था:
F(a⃗ )→P2(x),where P(x)=∑ai∈a⃗ xai
यह एल्गोरिथ्म अनिवार्य रूप से एल्गोरिथ्म है जिसे आप अपने प्रश्न में अनुरोध करते हैं। इस प्रकार, अगर मेरे पास एक जादू एल्गोरिथ्म है जो ऐसा कर सकता है, तो मैं एक फ़ंक्शन बना सकता हूं, जो पूर्णांक y को पार करेगा ( ओह हां, मैं मैथजैक्स प्यार करता हूं: पी ):SQUARE(y)y
1.:2.:3.:4.:5.:6.:7.:8.:9.:10.:11.:12.:13.:Algorithm 1 Squaringprocedure SQUARE(y):a⃗ ←()i←0while y≠0 doif y & 1 thena⃗ ←a⃗ iend ifi←i+1y←y≫1end whileP2(x)←F(a⃗ )return P2(2)end procedure▹ a⃗ starts as empty polynomial sequence▹ break y down into a polynomial of base 2▹ if lsb of y is set▹ append i to a⃗ (appending xi)▹ shift y right by one▹ obtain the squared polynomial via F(a⃗ )▹ simply sum up the polynomial
अजगर ( कोडपैड के साथ परीक्षण ):
#/cs//q/11418/2755
def F(a):
n = len(a)
for i in range(n):
assert a[i] >= 0
# (r) => coefficient
# coefficient \cdot x^{r}
S = {}
for ai in a:
for aj in a:
r = ai + aj
if r not in S:
S[r] = 0
S[r] += 1
return list(S.items())
def SQUARE(x):
x = int(x)
a = []
i = 0
while x != 0:
if x & 1 == 1:
a += [i]
x >>= 1
i += 1
print 'a:',a
P2 = F(a)
print 'P^2:',P2
s = 0
for e,c in P2:
s += (1 << e)*c
return s
3. इस प्रकार, स्क्वेरिंग इस समस्या के रूप में सबसे अधिक कठिन है।
4. इसलिए, पूर्णांक वर्ग इस समस्या के बराबर है। (वे प्रत्येक ( 2 , 3 , 1 ) के कारण एक-दूसरे की तरह कठोर होते हैं )
O(nlogn)O(nlognloglogn)O(nlogn2O(log∗n))Ω(nlogn)
O(nlogn)
5. अब, आपकी समस्या बिल्कुल गुणा नहीं है, यह चुकता है। तो चुकता करना आसान है? खैर, यह एक खुली समस्या है (अब के लिए नहीं) : स्क्वैरिंग को गुणन की तुलना में अधिक तेज़ एल्गोरिथम होने का पता नहीं है। यदि आप गुणा का उपयोग करने की तुलना में अपनी समस्या के लिए एक बेहतर एल्गोरिथ्म पा सकते हैं; तो यह संभवतः एक सफलता होगी।
O(nlogn) multiplication algorithms use FFT; and as of now squaring is as hard as multiplication. And no, unless a faster algorithm for squaring is found, or multiplication breaks the O(nlogn) barrier, your problem cannot be solved faster than O(nlogn); in fact, it cannot currently be solved in O(nlogn) either, as the best multiplication algorithm only approaches that complexity.