1 Câu hỏi: Tính tổng của hàm tổng số lên tới 10 ^ 16

câu hỏi được tạo ra tại Mon, Apr 29, 2019 12:00 AM

Đăng lại nó một cách rõ ràng, dễ hiểu mà không có bất kỳ MathJax phức tạp nào không xuất hiện đúng cách:

Tôi đã khám phá một số trang web về khoa học máy tính /lý thuyết số thách thức các trang web để giải trí và họ đã trình bày vấn đề sau, chính xác như sau:

Đặt 49 310

Tìm 49 310

Tôi đã tìm kiếm khá lâu về điều này và đã thử các cách tiếp cận khác nhau:

  1. Sử dụng công thức cho 49 310, tôi đã cố gắng tính toán 49 310 trong phạm vi, nhưng điều này trở nên rất kém hiệu quả đối với 49 310 lớn. Tôi có thể đạt được đến 49 310 với cách tiếp cận này. Ngoài ra, nó chỉ trở nên quá chậm.

  2. Tôi đã thử một cách khác, trực tiếp hơn. Wikipedia và Wolfram Alpha đề xuất các công thức tương tự để tính trực tiếp 49 310:

49 310

Công thức này có vẻ hứa hẹn hơn nhiều. Tôi đã thử nó và quản lý để có được nhiều hơn 49 310 nhưng vẫn còn xa mục tiêu. Với việc tính toán trước một cái rây của hàm Moebius, tôi có thể đạt được ít hơn 49 310 một chút. Bộ nhớ của tôi không đủ và không thể tính toán các giá trị nữa trong một cái sàng. Và ngay cả khi tôi có thể, nó vẫn mất một thời gian dài và rất xa so với 49 310.

Đây là một phần của mã mà tôi đã sử dụng cho cách tiếp cận thứ 2 của mình được viết bằng Java:

 49 310

Trong đó MoebiusSieve là một hàm tính toán các giá trị hàm Moebius đến một giới hạn nhất định trong sàng, sử dụng phương pháp giống như eratosthenes.

  1. Sau khi hiểu và thực hiện một phương pháp đệ quy mới cho tính toán này mà tôi tìm thấy trên internet:

P (n) = n (n + 1) /2 − ∑ {2 < = i < = √n} P (nn /i⌋) −∑ {1 < = j < = √n} P ( j) ⋅ (⌊n /j⌋ − n /(j + 1) ⌋)

Tôi có thể tính toán các giá trị lên tới 49 310 và với phân bổ bộ nhớ tối đa, tính toán trước càng nhiều φ (n) càng tốt và do đó, tất cả 49 310 mà tôi có thể ghi nhớ, tôi có thể tính toán 49 310 chỉ trong hơn 20 phút. Một cải tiến lớn nhưng vẫn còn hơi xa so với 49 310. Sẽ ổn nếu việc tính toán mất nhiều thời gian hơn một chút, nhưng tôi sợ 49 310 sẽ mất nhiều thời gian hơn theo cấp số nhân, đánh giá bằng "bước nhảy" trong thời gian tính toán trong khoảng từ 49 310 đến 49 310. Bộ nhớ của tôi cho phép tôi "lưu" tối đa 49 310 HOẶC lên đến 49 310. Có lẽ có một cách để thực hiện phép tính tổng bằng cách sử dụng các giá trị μ (k) thay vì φ (n)?.

Tất cả các tính toán của tôi đề xuất và cho thấy rằng đệ quy của tôi là người tiêu dùng thời gian nổi bật. Điều này là hiển nhiên, nhưng tôi chắc chắn rằng nó sẽ mất nhiều thời gian hơn bình thường. Tôi đang đăng bên dưới mã đệ quy, với một số tài liệu. Dường như với tôi đây là cách đúng đắn để thực hiện tính toán này, nhưng việc triển khai của tôi không tối ưu.

 49 310

Tôi đã được đề xuất sử dụng độc tài , ngoài mảng, cho các giá trị lớn là 49 310, nhưng tôi không biết gì về nó. Một cải tiến khác có thể được thực hiện để làm cho khung thời gian một ngày hay không?

    
4
  1. Bạn có thể vui lòng chia sẻ liên kết đến phương thức 3 và /hoặc giải thích về lý thuyết đằng sau nó không?
    2019-04-30 13: 36: 01Z
  2. @ גלעדב קן These-totient-summation-sum-hiệu quả /1740370 # 1740370 "title =" cách tính tổng các tổng này một cách hiệu quả "> math.stackexchange.com/questions/316376/,
    2019-04-30 13: 47: 19Z
  3. Cảm ơn. Thật thú vị, thuật toán được cung cấp bởi, Daniel Fischer, cũng là người đã viết Câu trả lời SO tôi đã chia sẻ trong (bây giờ đã xóa) câu trả lời :)
    2019-04-30 13: 52: 05Z
  4. Vâng, tôi cũng nhận thấy điều đó. Tôi nghĩ rằng đệ quy của tôi là vì một số lý do chậm hơn nó nên được. Tôi không biết làm thế nào để làm cho nó nhanh hơn. Có người đề nghị sử dụng từ điển để lưu trữ 49 310 giá trị.
    2019-04-30 13: 59: 19Z
  5. Tôi bối rối: không sử dụng 49 310 (trong phương thức 3) có nghĩa là chúng tôi sẽ cần một giá trị cho 49 310 ngay từ đầu?
    2019-05-01 00: 15: 32Z
1 Câu trả lời                              1                         

Nếu bạn muốn biết tổng số của một số n , cách tốt nhất để tìm nó là nhân tố n và lấy sản phẩm ít hơn 1 nhân tố ; chẳng hạn, 30 = 2 * 3 * 5 và trừ 1 từ mỗi yếu tố, sau đó nhân, sẽ cho tổng số 1 * 2 * 4 = 8. Nhưng nếu bạn muốn tìm tổng của tất cả các số nhỏ hơn một n , một cách tiếp cận tốt hơn so với bao thanh toán trong số chúng là sàng lọc. Ý tưởng rất đơn giản: Thiết lập một mảng X từ 0 đến n , lưu trữ i trong mỗi X_i , sau đó chạy qua mảng bắt đầu từ 0 và bất cứ khi nào X_i = i lặp qua bội số của i , nhân từng số cho ( i em> - 1) / i . Bạn có thể tính tổng vào cuối hoặc tích lũy khi bạn đi. Vì sàng của bạn sẽ lớn, bạn sẽ cần phân đoạn nó.

Đây là một số trang hữu ích từ blog của tôi: Sàng cho tổng số Rây phân đoạn của Eratosthenes . Nếu bạn chọc quanh đó, bạn cũng có thể tìm thấy một số điều thú vị khác.

    
0
2019-04-30 00: 18: 43Z
  1. Như tôi đã đề cập, tôi đã thử phương pháp này nhưng nó khá chậm so với các phương pháp khác. Nhưng ngay cả khi tôi làm điều đó, làm thế nào tôi có thể áp dụng phân khúc? Mỗi phân đoạn sau đều dựa vào phân đoạn trước, do đó, dường như một khi tôi 'ném' phân khúc trước đó, tôi thực sự không thể sản xuất một phân đoạn tiếp theo.
    2019-04-30 05: 06: 49Z
P(n) = sum{1<=k<=n} φ(k)
nguồn đặt đây