Tính toán căn bậc hai bằng cách sử dụng (bit) bổ sung và dịch chuyển như nguyên thủy


8

Câu hỏi: Cho một -bit số tự nhiên , làm thế nào để tính toán chỉ sử dụng (bit) bổ sung và thay đổi?nNNO(n)

Mẹo là sử dụng tìm kiếm nhị phân. Tuy nhiên, tôi không thể đạt được độ phức tạp cần thiết (tôi có ).O(n2)


Nó có nghĩa là gì using only $O(n)$ (bit) additions and shifts:

Đây là một bài tập trong một cuốn sách thuật toán.
Theo tôi, điều đó có nghĩa là việc thêm hai, giả sử -bit, số tự nhiên có giá và thay đổi a, nói -bit, số tự nhiên cũng có giá . Sau đó, chúng tôi chỉ được phép sử dụng các hoạt động lần như vậy. Nó không đề cập đến chi phí so sánh. Tôi đoán chúng ta có thể bỏ qua nó hoặc giả sử rằng so sánh hai, giả sử -bit, số tự nhiên cũng có giá .nO(1)nO(1)O(1)O(n)
nO(1)


My Thuật toánO(n2) :

  1. Xác định phạm vi số bit của : Do đó, t_1 \ Triangleq \ lfloor \ frac {n-1} {2} \ rfloor + 1 \ le t \ le \ lceil \ frac {n} {2} \ rceil + 1 \ Triangleq t_2.tN
    2n12N2n22n12N2n2
    t1n12+1tn2+1t2.
  2. Tìm kiếm nhị phân: Tìm N trong khoảng từ 2t1 đến 2t2 bằng cách sử dụng tìm kiếm nhị phân. Đối với mỗi số x , để tính x2 sử dụng bổ sung và thay đổi như nguyên thủy và so sánh nó với N .

Do đó, độ phức tạp là cho lần tìm kiếm nhị phân và tính toán , mỗi lần lượt sẽ bổ sung và thay đổi .O(n×n)=O(n2)O(n)x2O(n)

Câu trả lời:


7

Một thuật toán lặp có vẻ như nó nên hoạt động.

Đặt . Giả sử chúng ta biết rằng là xấp xỉ số nguyên với , tức là và giả sử chúng ta biết giá trị của (thu được trước đó).M=N/4xMx=Mx2

Bây giờ chúng tôi muốn tìm . Các giá trị có thể có của gì? Tôi khá chắc chắn rằng các giá trị duy nhất có thể là hoặc . Và, thật dễ dàng để thử cả hai và xem cái nào đúng. Cụ thể, với , chúng ta có , có thể lấy được từ bằng hai lần dịch chuyển trái ( ); với , chúng ta có , có thể thu được từ và với bốn lần dịch chuyển trái và hai lần bổ sung ( ). Bây giờ chỉ cần so sánh hai giá trị đó vớiy=Nyy=2xy=2x+1y=2xy2=4x2x2O(1)y=2x+1y2=4x2+4x+1x2xO(1)N để xem cái nào đúng

Theo cách này, chúng ta có được một thuật toán lặp trong đó chúng ta thực hiện lần lặp và trong đó mỗi lần lặp lại mất thời gian. Tổng thời gian chạy là , theo yêu cầu.n/2O(1)O(n)

Tôi nhận ra điều này đã không sử dụng tìm kiếm nhị phân. Ồ tốt


Đẹp! Cảm ơn. Không nên sử dụng tìm kiếm nhị phân. Một nitpicking: Lấy , chúng ta có , và . Tuy nhiên, . Do đó, nó có thể là hoặc . Ngoài ra, ý tưởng chính của việc sử dụng lại khi tính toán trong thuật toán của bạn cũng có thể được áp dụng cho bước thứ hai trong thuật toán . Tôi sẽ để mở này trong một hoặc hai ngày. N=9y=N=3M=N/4=2x=M=2y=2x1y=2xy=2x±1x2y2O(n2)
hengxin

3

Có phải chúng ta đang nói về số nguyên ở đây? N dài n bit?

A = 2(n/2), B = A  and C = A2
Step: B = B/2
     If C > N,  
         C = C - 2AB + B2    // too high - make smaller
         A = A - B
     Else 
         C = C + 2AB + B2   // keep this bit
         A = A + B                 
Repeat until B = 0                  // =1 on last loop

Vòng lặp được thực hiện n / 2 lần, sẽ mang lại cho bạn hiệu suất O (n)

Chỉnh sửa: Làm thế nào nó hoạt động, và tại sao?
Đây là một phiên bản của xấp xỉ liên tiếp, cũng được sử dụng trong các thuật toán CORDIC.
Bắt đầu với bit đơn lớn nhất có thể (với một hình vuông nhỏ hơn N), bạn đặt từng bit một và tính toán hình vuông mới.
Nếu hình vuông mới vẫn nhỏ hơn N, hãy giữ bit như đã đặt.
Nếu hình vuông mới quá lớn, hãy xóa bit, hoàn tác hiệu quả của việc thêm nó và chuyển sang bit tiếp theo.

Ví dụ: N = 441 (1 1011 1001 nhị phân), n = 9

Start:  A = 24 = 16 (1 0000)  B = 16 C = 256 (100 0000)

1   B = 8 (1000) C = 256 + 2(16)(8) + (8)(8) = 576 (10 0100 0000) {high}
    A = 16 + 8 = 24
2   B = 4  (100) C = 576 - 2(16)(4) + (4)(4) = 400 (1 1001 0000) {low}
    A = 24 - 4 = 20
3   B = 2   (10) C = 400 + 2(20)(2) + (2)(2) = 484  (1 1110 0100) {high}
    A = 20 + 2 = 22
4   B = 1    (1) C = 484 - 2(20)(1) + (1)(1) = 441  (1 1011 1001) {keep this}
    A = 22 - 1 = 21
5   B = 1/2 or 0 in integer math; end

Chào mừng bạn đến với Khoa học máy tính ! Lưu ý rằng bạn có thể sử dụng LaTeX tại đây để sắp xếp toán học theo cách dễ đọc hơn. Xem ở đây để giới thiệu ngắn.
FrankW

Một lời giải thích, tại sao (và làm thế nào) thuật toán này hoạt động sẽ tốt đẹp.
FrankW

0

Phương pháp chính là để điền vào các bit của từ trái sang phải trong khi vẫn giữ ước tính của chúng tôi bên dưới nó, hay đúng hơn là vuông của dự toán của chúng tôi dưới đây . Mỗi bit là lũy thừa của 2, vì vậy bình phương hoặc nhân một số khác với luôn luôn là một chút thay đổi. NNbb

Nếu ước tính hiện tại là , và chúng tôi đã biết , chúng tôi nhận được , và chúng tôi có thể viết lại các điều khoản thứ hai và thứ ba dưới dạng và . Sau đó chúng tôi thêm tất cả lên và kiểm tra (tôi giả sử bạn có thể làm ) và bộ cắn nếu vuông vẫn nằm dưới .ab=2ia2(a+b)2=a2+2ab+b2a<<(i+1)1<<(i<<1)<iN

Chúng tôi bắt đầu vòng lặp tại và đếm ngược về 0, giữ và khi chúng tôi đi. Đây là một loại tìm kiếm nhị phân, nhưng một trong đó giới hạn ánh xạ tới các khác biệt một bit.i=n/2=n>>1aa2


-3

Tôi thích câu trả lời của Alan Campbell : với việc theo dõi cẩn thận các dự đoán trước đó, phép trừ mới mỗi lần dễ dàng và căn bậc hai thay đổi và thêm nhị phân cũng nhanh như cách chia nhị phân và cộng.

Nhưng có thể có thể đi nhanh hơn, bằng cách thay vì đoán lần tiếp theo của bạn thành một chữ số nhị phân duy nhất, thay vào đó sử dụng thuật toán "Ab" x "Ab" và làm cho lần đoán tiếp theo của bạn trung bình cho lần đoán trước của bạn và số ban đầu được chia theo phỏng đoán trước đó. Nghe có vẻ như sẽ mất nhiều thời gian hơn, không ngắn hơn. Tuy nhiên, sự phân chia không phải chính xác. Vì vậy, nếu phép chia chỉ chạy đến căn bậc hai của số chữ số còn lại để tìm, thì bạn thực sự có thể tiết kiệm thời gian. Hơn nữa, nếu đối với phân chia của bạn, bạn sử dụng phương pháp tiếng Pháp, phân chia tốc ký, thì bạn thực sự có thể phá vỡ một số tốc độ trong tính toán của bạn cho các phân chia thực sự lớn.

Bây giờ, nếu chúng ta thêm vào các phép tính song song mang lại kết quả chính xác sơ bộ trước khi câu trả lời được tìm thấy ... thì chúng ta có thể đang ở một cái gì đó.


1
Tất cả điều này nghe có vẻ rất đầu cơ. Bạn có một câu trả lời chắc chắn hơn?
Yuval Filmus

Điều này đọc như một bình luận dài.
Raphael

@Raphael Vâng, đó là một câu trả lời một phần. Không phải là một câu hỏi hay, bởi vì nó cực kỳ suy đoán, nhưng nó không chỉ là một bài phê bình về câu trả lời của Alan.
Gilles 'SO- ngừng trở nên xấu xa'
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.