Câu hỏi của bạn đã được trả lời trong bài viết mà bạn gọi: "bước cơ bản Karatsuba của việc cho bất kỳ cơ sở B và bất kỳ m, nhưng thuật toán đệ quy hiệu quả nhất khi m bằng n/2, được làm tròn lên "... n
là số chữ số và 0 < = value_of_digit < B.
Một số góc nhìn có thể giúp :
Bạn được phép (và bắt buộc!) Để sử dụng hoạt động tiểu học như number_of_digits // 2
và divmod(digit_x * digit_x, B)
... trong số học, trong đó B là 10, bạn được yêu cầu (ví dụ) để biết rằng divmod(9 * 8, 10)
sản xuất (7, 2)
.
Khi thực hiện số học số lớn trên máy tính, thông thường để B trở thành công suất lớn nhất của 2 sẽ hỗ trợ thao tác nhân sơ cấp thuận tiện. Ví dụ trong việc triển khai CPython trên máy 32 bit, B được chọn là 2 ** 15 (tức là 32768), bởi vì sau đó product = digit_x * digit_y; hi = product >> 15; lo = product & 0x7FFF;
hoạt động mà không tràn và không quan tâm đến bit dấu.
Tôi không chắc những gì bạn đang cố gắng đạt được với triển khai bằng Python sử dụng B == 2, với số được biểu diễn bằng Python ints, thực hiện trong C đã sử dụng thuật toán Karatsuba để nhân số đủ lớn để làm cho nó đáng giá. Nó không thể là tốc độ.
Là bài tập học tập, bạn có thể muốn thử đại diện một số dưới dạng danh sách các chữ số, với cơ số B là tham số đầu vào.
Nguồn
2011-09-19 00:20:01
Cụ thể cho b = 2 cơ sở? (dễ dàng hơn tổng quát b) – smci
Bạn biết rằng phép nhân dài trong python sử dụng phép nhân Karatsuba trong nội bộ? Bạn luôn có thể nheo mắt vào nguồn python nếu bạn muốn một số ý tưởng. –