ดูเหมือนว่าปัญหานี้จะเท่ากับจำนวนเต็ม / พหุนามกำลังสอง:
1. เป็นที่รู้จักกันว่าการคูณพหุนามเทียบเท่ากับการคูณจำนวนเต็ม
2.เห็นได้ชัดว่าคุณลดปัญหาดังกล่าวเป็นพหุนาม / จำนวนเต็มกำลังสองแล้ว ดังนั้นปัญหานี้ยากที่สุดเท่าที่จะเป็นกำลังสอง
ตอนนี้ฉันจะลดจำนวนเต็มกำลังสองของปัญหานี้:
สมมติว่าคุณมีอัลกอริทึม:
F(a⃗ )→P2(x),where P(x)=∑ai∈a⃗ xai
อัลกอริทึมนี้เป็นหลักอัลกอริทึมที่คุณร้องขอในคำถามของคุณ ดังนั้นถ้าฉันมีอัลกอริทึมเวทมนต์ที่สามารถทำสิ่งนี้ได้ฉันสามารถสร้างฟังก์ชันที่จะยกกำลังสองจำนวนเต็มy ( โอ้ใช่ฉันรัก mathjax: P ):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
Python ( ทดสอบด้วยแผ่นจดบันทึก ):
#/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. ดังนั้นการ squaring นั้นยากที่สุดเท่ากับปัญหานี้
4. ดังนั้นการ squaring จำนวนเต็มจึงเท่ากับปัญหานี้ (พวกเขาแต่ละคนมีความแข็งแกร่งเท่ากันเนื่องจาก ( 2 , 3 , 1 ))
O(nlogn)O(nlognloglogn)O(nlogn2O(log∗n))Ω(nlogn)
O(nlogn)
5.ทีนี้ปัญหาของคุณไม่ใช่การคูณแน่นอนมันกำลังสอง ดังนั้นการ squaring ง่ายขึ้น? มันเป็นปัญหาแบบเปิด (ไม่ใช่ตอนนี้) : การรู้กำลังสองไม่ได้มีอัลกอริธึมเร็วกว่าการคูณ หากคุณสามารถหาอัลกอริทึมที่ดีกว่าสำหรับปัญหาของคุณได้มากกว่าการใช้การคูณ แล้วนี่อาจเป็นความก้าวหน้า
O(nlogn)O(nlogn)O(nlogn)O(nlogn) ในฐานะที่เป็นอัลกอริธึมการคูณที่ดีที่สุดจะเข้าใกล้ความซับซ้อนนั้นเท่านั้น