Số FLOP (phép toán dấu phẩy động) để lũy thừa


7

Số lượng các phép toán dấu phẩy động cần thiết để thực hiện lũy thừa (sức mạnh của) là gì?

Giả sử phép nhân của hai số float sử dụng một FLOP, số lượng thao tác cho sẽ là . Tuy nhiên, có cách nào nhanh hơn để làm điều này? Làm thế nào nó hoạt động nếu không phải là một số nguyên?xnn1n

Câu trả lời:


6

Giả sử phép nhân giữa hai số sử dụng một FLOP, số lượng thao tác cho sẽ là . Tuy nhiên, có cách nào nhanh hơn để làm điều này ...xnn1

Chắc chắn là có một cách nhanh hơn để làm điều này đối với các số nguyên không âm. Ví dụ: . Phải mất một phép nhân để tính , thêm một lần nữa để tính , thêm một lần nữa để tính và hai lần nữa để nhân ba số đó. Điều này cho thấy một chi phí đơn giản và một thuật toán đơn giản.x14=x8x4x2x2x4x8

  • Chuyển đổi công suất nguyên không âm sang cơ sở 2.
  • Đếm số lượng của những người trong đại diện này.
  • Thêm sức mạnh của hai tương ứng với bit khác không có ý nghĩa nhất trong biểu diễn này.
  • Trừ đi một.

Điều này mang lại một thuật toán ngắn gọn cho bất kỳ công suất nguyên không âm. Thuật toán này là hiệu quả nhất, lên tới . Thuật toán này gợi ý sáu phép nhân là cần thiết để tính kể từ . Tuy nhiên, 15 là 120 trong cơ sở 3 và 30 trong cơ sở 5, cả hai đều ngụ ý rằng chỉ cần năm phép nhân để tính : từ cơ sở ba đại diện và từ đại diện năm cơ sở. Số phép nhân tối thiểu cần thiết để tính trong đó là số nguyên không âm thực tế là một bài toán hoàn thành NPx14x15x15=x8x4x2xx15x15=(x3)4x3x15=(x5)3xnn. Nhưng nó ít hơn rất nhiều so với phép nhân .n1

... và nó hoạt động như thế nào nếu không phải là số nguyên?n

Có một số thủ thuật người ta có thể sử dụng nếu là hợp lý. Nhưng nếu là số thực và là số thực không âm, người ta phải sử dụng các kỹ thuật gần đúng. (Ví dụ: các kỹ thuật gần đúng được sử dụng hai lần trong khi tính toán .)nxnexp(nln(x))


Bạn có chắc chắn tính toán số lượng nhân cần thiết trong NP-Complete không? Đây có vẻ như là một vấn đề phụ thuộc vào yếu tố, được cho là NP-Trung cấp.
stux

Bạn có một tài liệu tham khảo cho sự phức tạp của chuỗi bổ sung?
Yuval Filmus

@stux: Chỉ vì các yếu tố mang lại giải pháp ứng cử viên không ngụ ý rằng tất cả các giải pháp đều dựa trên yếu tố hóa ...
user21820 ngày

@ user21820: điều đó rất đúng, do đó câu hỏi và từ ngữ của tôi. Nếu tất cả các giải pháp được thúc đẩy bởi yếu tố hóa thì vấn đề (rất có thể) không thể hoàn thành NP. Nếu không, thì liên kết được cung cấp không bao gồm tham chiếu chứng minh tính đầy đủ của NP.
stux

2
@stux - Downey, Peter, Benton Leong và Ravi Sethi. "Trình tự tính toán với chuỗi bổ sung." Tạp chí SIAM về máy tính 10.3 (1981): 638-646.
David Hammen

5

Sử dụng phép nhân n-1 sẽ khá daft. Ví dụ: nếu n = 1024, bạn chỉ cần bình phương x mười lần. Trường hợp xấu nhất là 2 * log_2 (n). Bạn có thể tra cứu Donald Knuth, Nghệ thuật lập trình máy tính, để biết một số chi tiết làm thế nào để làm điều đó nhanh hơn. Có một số tình huống, như n = 1023, trong đó bạn sẽ bình phương x mười lần cho x ^ 1024, sau đó chia cho x.


Cảm ơn, không biết tại sao điều đó không xuất hiện trong tâm trí tôi ...
Ông Eivind

4

Bạn có thể sử dụng công thức

xy=exp(ylnx).

Nếu bạn chỉ muốn sử dụng phép nhân, khi là số tự nhiên, bạn có thể sử dụng bình phương lặp lại , sử dụng phép nhân . Đối với khác , phép nhân một mình không đủ.nO(logn)n


3

Mọi người nói với bạn những gì xảy ra khi là một số nguyên.n

Về điều đó khi không, thậm chí có thể không tồn tại một cách để thực hiện phép lũy thừa dấu phẩy động.

Nó được gọi là Thế lưỡng nan của Trình tạo bảng , cho biết dung lượng bộ nhớ bạn cần không bị ràng buộc:

Không có cách chung nào tồn tại để dự đoán có bao nhiêu chữ số phụ sẽ phải được thực hiện để tính toán một biểu thức siêu việt và làm tròn nó chính xác với một số chữ số được gán trước.
Ngay cả thực tế (nếu đúng) rằng một số hữu hạn các chữ số phụ cuối cùng sẽ đủ có thể là một định lý sâu sắc.


Đối với số học dấu phẩy động, rõ ràng là một số hữu hạn các chữ số phụ sẽ đủ, bởi vì có một bộ đầu vào hữu hạn.
gnasher729 ngày

@ gnasher729: Vâng ... Tôi sẽ không đăng bài này trên StackOverflow, nhưng với điều này là trên CS.SE, tôi không chắc chắn cách hiểu nghĩa của từ "dấu phẩy động" trong câu hỏi. Tôi nghĩ rằng có một cơ hội tốt nó chỉ được sử dụng như một từ đồng nghĩa của "không nguyên" nên tôi nghĩ rằng tôi đã đề cập đến trường hợp siêu việt cho sự hoàn chỉnh.
dùng541686 ngày

1
Có thể liên quan chặt chẽ đến điều này là sự chậm chạp phi thườngpow(x,y) (trước đây) của việc triển khai thư viện toán học gcc trước đây đối với một số đầu vào . Nó đã rất cố gắng (được cho là đã cố gắng quá sức) để đuổi theo độ chính xác của một nửa khó nắm bắt.
David Hammen

0

Nếu bạn nghiêm túc về vấn đề này, bạn có thể không cố gắng tìm một giải pháp có số lần nhân thấp nhất, nhưng với thời gian thực hiện thấp nhất.

Hãy xem xét một mô hình trong đó bạn có thể bắt đầu phép nhân trong mỗi chu kỳ, nhưng mỗi phép nhân có một số chu kỳ cố định, giả sử là 3 chu kỳ. Một phương pháp tính x ^ n với k phép nhân có thể mất 3k chu kỳ (nếu mỗi phép nhân phụ thuộc vào kết quả được tính toán trước đó), trong khi phương pháp aa sử dụng nhiều phép nhân có thể chạy nhanh hơn.

Ví dụ: Để tính x ^ 15, bạn có thể tính theo thứ tự đó x ^ 2 = x * x, x ^ 3 = (x ^ 2) * x, x ^ 6 = (x ^ 3) ^ 2, x ^ 7 = x ^ 6 * x, x ^ 14 = (x ^ 7) ^ 2, x ^ 15 = x ^ 14 * x. Sáu phép nhân, nhưng mỗi phép nhân phụ thuộc vào số trước.

Hoặc bạn tính x ^ 2, x ^ 4 = (x ^ 2) ^ 2, x ^ 3 = x ^ 2 * x, x ^ 5 = (x ^ 4) * x, x ^ 15 = x ^ 5 * x ^ 3, vì vậy bạn chỉ có bốn phép nhân tùy thuộc vào kết quả trước đó.


Đoạn cuối có lỗi. là , không phải . Tínhx5x3x8x15x15 yêu cầu ít nhất năm phép nhân (hoặc bốn phép nhân để mang lạix16, tiếp theo là một bộ phận bởi x, nhưng nó đắt hơn năm phép nhân).
David Hammen
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.