2012-09-24 28 views
13

Tạo số nguyên tố là vấn đề đồ chơi mà tôi thường cố gắng, đặc biệt khi thử nghiệm với ngôn ngữ lập trình, nền tảng hoặc kiểu mới.Thuật toán song song để tạo số nguyên tố (có thể sử dụng bản đồ của Hadoop giảm)

Tôi đã nghĩ đến việc cố gắng viết một thuật toán Tạo số nguyên tố hoặc Thuật toán kiểm tra số nguyên tố bằng cách sử dụng Hadoop (Map Reduce).

Tôi nghĩ tôi muốn đăng câu hỏi này để nhận mẹo, tham chiếu, thuật toán, phương pháp tiếp cận.

Mặc dù sự quan tâm chính của tôi là một bản đồ Giảm thuật toán dựa Tôi sẽ không phiền nhìn vào mô hình lập trình Hadoop mới hoặc ví dụ xem xét sử dụng PiCloud

tôi có vẻ như một số câu hỏi thú vị ở đây trên Thủ Số Generation: here, herehere, nhưng không có gì liên quan đến cách tiếp cận song song bắt gặp ánh mắt của tôi.

Xin cảm ơn trước.

+0

xem http://www.mersenne.org và http://en.wikipedia.org/wiki/Great_Internet_Mersenne_Prime_Search, cũng có một nhóm người Trung Quốc tìm thấy số nguyên tố rất lớn và tôi khá chắc chắn rằng cả hai sẽ có một thuật toán song song khá (MPI/Phân phối) để làm như vậy – pyCthon

Trả lời

11

Đây là an algorithm được xây dựng trên bản đồ và giảm (folding). Nó thể hiện sieve of Eratosthenes

        P = {3,5,7, ...} \ U {{p , p + 2p, p + 4p, ...} | p trong P}

cho số nguyên tố lẻ (nghĩa là không có 2). Gấp được vô hạn định sâu sắc về bên phải, như thế này:

tree-like folding

trong đó mỗi số nguyên tố đánh dấu một dòng bội lẻ của nguyên tố đó, ví dụ cho : 49, 49 + 14, 49 + 28, ..., tất cả được kết hợp để có được tất cả các hợp số, và sau đó số nguyên tố được tìm thấyvào những khoảng trống giữa hợp số. Đó là trong Haskell, do đó, thời gian được xử lý hoàn toàn bởi cơ chế đánh giá lười biếng (và điều chỉnh thuật toán trong đó mỗi nút so sánh luôn cho phép thông qua số đầu tiên từ bên trái mà không yêu cầu số từ bên phải, bởi vì nó là đảm bảo lớn hơn).

Tỷ lệ có thể được sử dụng thay cho số nguyên tố lẻ làm hạt cho thế hệ bội số, để đơn giản hóa mọi thứ (với ý nghĩa hiệu suất rõ ràng).

Công việc có thể được chia thành các phân đoạn giữa các ô số nguyên tố liên tiếp.Haskell đang sau, nhưng chúng ta có thể coi đó là một giả thực thi quá (nơi : là danh sách nút constructor lười biếng, một cuộc gọi chức năng f(x) được viết f x, và dấu ngoặc đơn được sử dụng để chỉ nhóm):

primes() = 2 : ([3,5..] `minus` unionAll [[p*p, p*p+2*p..] | p <- prs]) 
    where 
    prs = 3 : ([5,7..] `minus` unionAll [[p*p, p*p+2*p..] | p <- prs]) 
    unionAll ((x:xs):t) = x : union xs (unionAll (pairs t)) 
    pairs ((x:xs):ys:t) = (x : union xs ys) : pairs t 

union (x:xs) (y:ys) = case compare x y of 
    LT -> x : union xs (y:ys) 
    EQ -> x : union xs ys 
    GT -> y : union (x:xs) ys 

minus (x:xs) (y:ys) = case compare x y of 
    LT -> x : minus xs (y:ys) 
    EQ ->  minus xs ys 
    GT ->  minus (x:xs) ys 

Cuộc thảo luận là here. Phức tạp hơn, lập lịch lazer là here. Đồng thời this SO answer hiển thị bản dịch gần đúng của mã Haskell (liên quan) về máy phát điện.

+0

chỉ là một lưu ý phụ phức tạp này sẽ là lớn O (n ln (ln (n))? – pyCthon

+0

điều này sẽ không được xấu cho một mã phân phối là tốt – pyCthon

+1

Tôi không nghĩ như vậy, không có 'n log (log n)' được xác định dựa trên khả năng sử dụng giá trị như * address *, để đánh dấu trong O (1) thời gian mục nhập tương ứng với bội số, như là tổng hợp. Ở đây các giá trị được so sánh và loại bỏ trùng lặp, giống như sự phân biệt giữa sắp xếp số nguyên và các loại so sánh, mà thực hiện (ít nhất) yếu tố 'log n' thừa, luôn luôn. [Empirically] (http://en.wikipedia.org/ wiki/Analysis_of_algorithms # Thực nghiệm _orders_of_growth) nó [chạy tại '~ n^1.2 .. 1.25'] (http://ideone.com/p0e81) (xem _TMWE_ mục đó) để tạo ra vài triệu số nguyên tố đầu tiên, và xấu đi. –

Các vấn đề liên quan