Một trong những vấn đề với phương pháp của Newton là nó đòi hỏi một phép toán chia trong mỗi lần lặp, đây là phép toán số nguyên cơ bản chậm nhất.
Phương pháp của Newton cho căn bậc hai đối ứng , tuy nhiên, không. Nếu là số mà bạn muốn tìm , lặp lại:1x1x√
ri+1=12ri(3−xr2i)
Điều này thường được thể hiện như sau:
d i = 1 - w i x r i + 1 = r i + r i d i
wi=r2i
di=1−wix
ri+1=ri+ridi2
Đó là ba hoạt động nhân. Việc phân chia theo hai có thể được thực hiện như một sự thay đổi.
Bây giờ vấn đề là không phải là số nguyên. Tuy nhiên, bạn có thể thao tác như vậy bằng cách thực hiện thủ công dấu phẩy động và thực hiện một loạt các thao tác thay đổi để bù khi thích hợp.r
Đầu tiên, hãy hủy bỏ :x
x′=2−2ex
trong đó chúng tôi muốn lớn hơn, nhưng gần với, . Nếu chúng tôi chạy thuật toán trên trên thay vì , chúng tôi tìm thấy . Sau đó, .x′1x′xr=1x√′x−−√=2erx′
Bây giờ chúng ta hãy chia thành một mantissa và số mũ:r
ri=2−eir′i
trong đó là một số nguyên. Theo trực giác, đại diện cho độ chính xác của câu trả lời.r′iei
Chúng ta biết rằng phương pháp của Newton gần gấp đôi số chữ số có nghĩa chính xác. Vì vậy, chúng ta có thể chọn:
ei+1=2ei
Với một chút thao tác, chúng tôi tìm thấy:
ei+1=2ei
wi=r′i2
x′i=x22e−ei+1
di=2ei+1−w′ix′i2ei+1
r′i+1=2eir′i−r′idi2ei+1
Tại mỗi lần lặp:
x−−√≈r′ix2e+ei
Ví dụ: hãy thử tính căn bậc hai của . Chúng tôi tình cờ biết rằng câu trả lời là . Căn bậc hai đối ứng là , vì vậy chúng tôi sẽ đặt (đây là thang đo của vấn đề) và theo dự đoán ban đầu của chúng tôi, chúng tôi sẽ chọn và . (Nghĩa là, chúng tôi chọn cho ước tính ban đầu của chúng tôi là .)x=2632312–√12√2−31e=31r′0=3e0=23412√
Sau đó:
e1=4,r′1=11
e2=8,r′2=180
e3=16,r′3=46338
e4=32,r′4=3037000481
Chúng ta có thể tìm ra khi nào nên dừng lặp lại bằng cách so sánh với ; nếu tôi đã tính toán chính xác, sẽ đủ tốt. Tuy nhiên, chúng tôi sẽ dừng ở đây và tìm:eieei>2e
263−−−√≈3037000481×263231+32=3037000481
Căn bậc hai số nguyên chính xác là , vì vậy chúng tôi khá gần nhau. Chúng ta có thể thực hiện một lần lặp khác hoặc thực hiện một lần lặp cuối cùng được tối ưu hóa mà không nhân đôi . Các chi tiết được để lại như một bài tập.3037000499ei
Để phân tích độ phức tạp của phương pháp này, lưu ý rằng nhân hai số nguyên -bit cần các thao tác . Tuy nhiên, chúng tôi đã sắp xếp mọi thứ sao cho . Vì vậy, phép nhân để tính nhân hai số -bit để tạo ra một số và hai phép nhân khác nhân hai số để tạo ra một số số -bit.bO(blogb)r′i<2eiwieiei+1ei+12ei+1
Trong mỗi trường hợp, số lượng thao tác trên mỗi lần lặp là và có các lần lặp . Phép nhân cuối cùng là theo thứ tự các phép toán . Vì vậy, độ phức tạp tổng thể là các phép toán , là bậc hai trong số các bit trong . Đó là tất cả các hộp.O ( log e ) O ( 2 e log 2 e ) O ( e log 2 e ) xO(eilogei)O(loge)O(2elog2e)O(elog2e)x
Tuy nhiên, phân tích này ẩn chứa một nguyên tắc quan trọng mà mọi người làm việc với các số nguyên lớn nên ghi nhớ: bởi vì phép nhân là siêu tuyến trong số bit, bất kỳ thao tác nhân nào chỉ nên được thực hiện trên các số nguyên có độ lớn gần bằng độ chính xác hiện tại (và , Tôi có thể thêm, bạn nên cố gắng nhân các số với nhau có thứ tự cường độ tương tự nhau). Sử dụng số nguyên lớn hơn đó là một sự lãng phí nỗ lực. Các yếu tố không đổi quan trọng, và đối với các số nguyên lớn, chúng quan trọng rất nhiều.
Như một quan sát cuối cùng, hai trong số các phép nhân có dạng . Rõ ràng thật lãng phí khi tính tất cả các bit của chỉ để ném chúng đi với một ca phải. Việc thực hiện một phương pháp nhân thông minh có tính đến điều này cũng được coi là một bài tập. abcab2cabc