Tính toán một chuỗi số nguyên có nguồn gốc từ các thừa số nguyên tố


10

Tạo một hàm, biểu thức hoặc chương trình thực hiện như sau:

  1. Lấy các thừa số nguyên tố của bất kỳ số nào và tính tổng chúng. Ví dụ: các thừa số nguyên tố của 28 là 2 2 7, tổng cộng là 11.
  2. Nhân kết quả với số lượng các thừa số nguyên tố cho số đã cho. Ví dụ: 28 có 3 thừa số nguyên tố bằng 11. 11 * 3 là 33.
  3. Lặp lại quy trình một cách đệ quy, lưu trữ danh sách kết quả (bắt đầu bằng số ban đầu), cho đến khi bạn đạt được một số đã được đưa vào danh sách. Dừng lại mà không thêm số cuối cùng, để danh sách không chứa các bản sao. Tiến trình cho 28 là 28 33, vì 33 kết quả trong 28 lần nữa.
  4. Đếm các yếu tố trong danh sách kết quả. Trong trường hợp 28, câu trả lời là 2.

Dưới đây là kết quả cho 0<n<=10, vì vậy bạn có thể kiểm tra thuật toán của mình.

2 1 1 10 1 11 1 9 5 10

(Như balpha đã chỉ ra, câu trả lời cho higley(1)là 2, từ danh sách 1 0. Ban đầu tôi có 1, do một lỗi trong thuật toán ban đầu của tôi được viết bằng J.)

Vì tôi là một SOB tự phụ và không tìm thấy điều này trên OEIS , nên hãy gọi đây là "Chuỗi Higley", ít nhất là trong suốt thời gian của vòng golf mã này. Là một tiền thưởng thêm, tìm ra hai đầu tiên ncó mức thấp nhất higley(n)nkhông là số nguyên tố và n>1. (Tôi nghĩ chỉ có hai, nhưng tôi không thể chứng minh điều đó.)

Đây là môn đánh gôn tiêu chuẩn, vì vậy, như thường lệ, số lần gõ phím ít nhất sẽ thắng, nhưng tôi yêu cầu bạn vui lòng đưa ra các câu trả lời thông minh bằng các ngôn ngữ khác, ngay cả khi chúng dài dòng.


4
Tại sao highley(1) == 1vậy? Một không có yếu tố chính, vì vậy danh sách kết quả trong 4) là [1, 0], vì vậy highley(1) == 2như tôi thấy.
balpha

Chúng ta có thể giả sử rằng số đầu vào và giá trị trung gian sẽ không lớn hơn 2 ^ 31-1 (tức là vừa với số nguyên 32 bit đã ký) không?
Peter Taylor

@Peter Taylor Chắc chắn.
Gregory Higley

Trong trường hợp bất cứ ai thấy nó hữu ích, các chuỗi OEIS có liên quan mơ hồ và có thể cung cấp một số nguồn cảm hứng là A001414, A001222 và A002217.
Peter Taylor

1
vì bạn chưa nhận xét Tôi cho rằng bạn chưa nhận thấy: Tôi đã chứng minh rằng chỉ có hai điểm cố định không chính và thêm nó dưới dạng phụ lục vào bài đăng của tôi.
Peter Taylor

Câu trả lời:


6

J, 47 45

#@((~.@,[:(+/@{:*+/@:*/)2 p:{:)^:_)`2:@.(=&1)

Có thể điều này sẽ ngắn hơn nhiều nếu không sử dụng ^:_, nhưng bộ não của tôi đã được chiên đủ rồi.

Chỉnh sửa: (47-> 45) Ngày phiếu giảm giá gấp đôi.

Sử dụng:

   higley =: #@((~.@,(+/@{:*+/@:*/)@(2&p:)@{:)^:_)`2:@.(=&1)
   higley 1
2
   higley"0 (1 + i. 10)
2 1 1 10 1 11 1 9 5 10

Ồ Giải pháp AJ ngắn hơn giải pháp GolfScript. Cái đầu tiên tôi đã thấy. (Tôi là một fan hâm mộ lớn của J.)
Gregory Higley

3
Bạn có thể rút ngắn đáng kể điều này bằng cách sử dụng một thuật toán hơi khác: #@((~.@,((+/*#)@:q:)@{:)^:_)`2:@.(=&1)đó là 38 ký tự.
Gregory Higley

Ồ, tôi đã cố gắng tìm ra cách thực hiện với q: nhưng đã cố gắng xử lý nó thành giải pháp 2 p: vì vậy tôi đã không nhận được. Rõ ràng khi nhìn lại.
Jesse Millikan

Việc bạn có thể nhìn vào sự bùng nổ của các nhân vật và nói rằng " rõ ràng khi nhìn lại " chỉ đơn giản là thổi bay tâm trí của tôi. Một trong những ngày này tôi nên xem Golfscript hoặc J.
Casey

@Casey Tôi cũng cảm thấy như vậy tại một thời điểm, nhưng bạn càng học và sử dụng J nhiều hơn, nó càng "nhảy ra khỏi bạn", mặc dù tôi vẫn thấy những điều tôi phải giải đố. Một điều hữu ích để biết về J là nếu bạn thêm a. hoặc: sau khi một biểu tượng, nó tạo ra một biểu tượng mới, ví dụ như, {, {., và {:tất cả mọi thứ có ý nghĩa khác nhau, nhưng {-(ví dụ) chắc chắn là một chuỗi trong hai điều, {-.
Gregory Higley

5

Golfscript, 68 67 62 61 ký tự

[.]({[.2@{1$1$%{)}{\1$/1$}if}*;;].,*0+{+}*.2$?@@.@+\@)!}do;,(

Đây là một biểu thức: nó lấy ntrên ngăn xếp và để lại kết quả trên ngăn xếp. Để biến nó thành một chương trình lấy ntừ stdin và in kết quả ra thiết bị xuất chuẩn, thay thế phần đầu [bằng~

Trung tâm của nó là [.2@{1$1$%{)}{\1$/1$}if}*;;](28 ký tự) chiếm số cao nhất trên ngăn xếp và (bằng một thuật toán cực kỳ kém hiệu quả) tạo ra một danh sách các yếu tố chính của nó. Mã giả tương đương kiểu C:

ps = [], p = 2;
for (int i = 0; i < n; i++) {
    if (n % p == 0) {
        ps += p;
        n /= p;
    }
    else p++;
}

Việc 0+trước đây {+}*là xử lý trường hợp đặc biệt n==1, vì Golfscript không thích gấp một thao tác nhị phân trong danh sách trống.

Một trong những điểm cố định không chính là 27; Tôi đã tìm thấy điều này mà không sử dụng chương trình bằng cách xem xét ánh xạ (p a -> a 2 p), đây là điểm cố định nếu a == p (a-1) / 2 và thử nhỏ a. ( a==1đưa ra sự cố định của các số nguyên tố).

Tìm kiếm với chương trình sẽ xuất hiện điểm cố định thứ hai: 30 = (2 + 3 + 5) * 3


Phụ lục: bằng chứng là chỉ có hai điểm cố định không chính

Ký hiệu: sopfr(x)là tổng các thừa số nguyên tố của x, với sự lặp lại (A001414). Omega(x)là số lượng các thừa số nguyên tố của x(A001222). Vì vậy, chức năng kế nhiệm Higley làh(x) = sopfr(x) Omega(x)

Giả sử chúng ta có một điểm cố N = h(N)định là sản phẩm của n=Omega(N)số nguyên tố.

N = p_0 ... p_{n-1} = h(N) = n (p_0 + ... + p_{n-1})

Lý thuyết số cơ bản: nchia thành p_0 ... p_{n-1}, vì vậy w=Omega(n)các số nguyên tố đó là các yếu tố chính của n. Wlog chúng tôi sẽ đưa họ là người cuối cùng w. Vì vậy, chúng ta có thể chia cả hai bên nvà có được

p_0 ... p_{n-w-1} = p_0 + ... + p_{n-1}

hoặc là

p_0 ... p_{n-w-1} = p_0 + ... + p_{n-w-1} + sopfr(n)

Cho rằng tất cả các số nguyên tố p_0để p_{n-w-1}được lớn hơn 1, tăng ai trong số họ làm tăng LHS hơn RHS. Vì vậy, cho một n, chúng tôi có thể liệt kê tất cả các giải pháp ứng cử viên.

Cụ thể, không thể có giải pháp nếu LHS lớn hơn RHS đặt tất cả các số nguyên tố "miễn phí" thành 2. Tức là không có giải pháp nào nếu

2^{n-w} > 2 (n-w) + sopfr(n)

sopfr(n) <= n(với đẳng thức chỉ cho n = 4 hoặc n số nguyên tố), chúng ta có thể đưa ra tuyên bố yếu hơn rằng không có điểm cố định nếu

2^{n-w} > 3 n - 2 w

Giữ wcố định chúng ta có thể chọn các giá trị khác nhau của sự nthỏa mãn w=Omega(n). Nhỏ nhất nlà như vậy 2^w. Lưu ý rằng nếu 2^{n-w}ít nhất là 3 (tức là nếu n-w>1, điều đó đúng nếu n>2) thì tăng ntrong khi giữ whằng số sẽ tăng LHS nhiều hơn RHS. Cũng lưu ý rằng cho w>2và lấy nhỏ nhất có thể n, bất đẳng thức được thỏa mãn và không có điểm cố định.

Điều đó để lại cho chúng tôi ba trường hợp: w = 0n = 1; w = 1nlà số nguyên tố; hay w = 2nlà bán thủ.

Trường hợp w = 0. n = 1, như vậy Nlà bất kỳ nguyên tố.

Trường hợp w = 1. Nếu n = 2sau đó N = 2pvà chúng tôi yêu cầu p = p + 2, mà không có giải pháp. Nếu n = 3sau đó chúng ta có pq = p + q + 3và hai giải pháp, (p=2, q=5)(p=3, q=3). Nếu n = 5sau đó 2^4 > 3 * 5 - 2 * 1, vì vậy không có giải pháp hơn nữa với w = 1.

Trường hợp w = 2. Nếu n = 4sau đó N = 4pqvà chúng tôi yêu cầu pq = p + q + 4. Điều này có giải pháp số nguyên p=2, q=6, nhưng không có giải pháp chính. Nếu n = 6sau đó 2^4 > 3 * 6 - 2 * 2, vì vậy không có giải pháp hơn nữa với w = 2.

Tất cả các trường hợp đã hết, vì vậy các điểm cố định không chính là 27 và 30.


1
Tìm thấy hai điểm cố định giống nhau bằng cách sử dụng bút chì và giấy: 27 và 30. Tôi đồng ý với OP có vẻ như đó là hai điểm duy nhất.
mellamokb

1
Câu hỏi thú vị tiếp theo có thể là. Có vô số higley (x) = 2 không? Làm thế nào về có một cách để tạo higley tùy ý (x), chẳng hạn như higley (x) = 100?
mellamokb

Rất đẹp! Tôi là một chàng trai J nhưng có lẽ phải học GolfScript.
Gregory Higley

@mellamokb Tôi nghĩ có một số câu hỏi thú vị với trình tự này. Chẳng hạn, nếu chúng ta xem xét chuỗi số được tạo cho mỗi số ntrước khi nó được tính, liệu có bất kỳ số nguyên tố nào nsau 49 mà chuỗi đã nói không kết thúc sau 28 không?
Gregory Higley

2
Một câu hỏi thú vị khác là liệu có một chức năng đơn giản nào trong nđó giới hạn higley(n)ở trên không. (Điều đó sẽ cho phép đơn giản hóa vòng lặp đáng kể - chỉ cần lặp lại f(n)thời gian và sau đó loại bỏ các bản sao).
Peter Taylor

4

Ruby, 92 ký tự

f=->i{r=[i];(x=s=0;(2..i).map{|j|(s+=j;x+=1;i/=j)while i%j<1};r<<i=s*x)until r.uniq!;r.size}

Giải pháp này giả định higley (1) thực sự là 2, không phải 1 (xem bình luận của balpha ở trên):

(1..10).map &f
=> [2, 1, 1, 10, 1, 11, 1, 9, 5, 10]

2

Octave - 109 ký tự

l=[input('')];while size_equal(unique(l),l);n=factor(l(1));l=[sum(n)*length(n) l];endwhile;disp(length(l)-1);

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.