Hệ số nguyên tố cao nhất của các số lân cận


13

Tôi nghĩ thật dễ dàng để giải thích thách thức này một cách tuần tự. Bắt đầu với số đầu vào N và:

  1. Tìm hệ số nguyên tố cao nhất của nó
  2. Kiểm tra số trên và dưới N và xem nếu yếu tố thủ cao nhất là cao hơn (tức là yếu tố quan trọng nhất của N-1 và / hoặc N + 1 là cao hơn so với các yếu tố của N .
  3. Tiếp tục kiểm tra các số cao hơn và / hoặc thấp hơn lân cận N theo hướng mà các yếu tố cao nhất đang tăng ( (N-2, N-3 ...) và / hoặc (N + 2, N + 3 ...) và như vậy trên)
  4. Khi không có bất kỳ yếu tố chính nào theo một trong hai hướng cao hơn các yếu tố chúng tôi đã tìm thấy, chúng tôi dừng lại và đưa ra yếu tố chính cao nhất mà chúng tôi đã gặp.

Hãy xem xét một ví dụ:

245có các yếu tố chính 5, 7, 7. Hàng xóm của nó là:

244 -> 2,  2,  61
245 -> 5,  7,  7
246 -> 2,  3,  41

Yếu tố chính cao nhất đang tăng theo cả hai hướng, vì vậy chúng ta phải nhìn vào người hàng xóm tiếp theo:

243 -> 3,   3,  3,  3,  3
244 -> 2,   2,  2,  61
245 -> 5,   7,  7
246 -> 2,   3,  41
247 -> 13,  19

Các yếu tố nguyên tố cao nhất hiện đang giảm theo cả hai hướng, do đó, yếu tố nguyên tố cao nhất chúng ta gặp phải là 61, và do đó nên được trả lại.

Một vi dụ khac:

Hãy nhìn vào 1024. Yếu tố chính của nó là 2, 2, 2, 2, 2, 2, 2, 2, 2, 2. Các yếu tố chính của các nước láng giềng gần nhất là:

1023 -> 3, 11, 31
1024 -> 2,  2,  2,  2,  2,  2,  2,  2,  2,  2
1025 -> 5,  5, 41

Yếu tố chính cao nhất đang tăng theo cả hai hướng, từ 2đến 31hoặc 41. Hãy nhìn vào những người hàng xóm:

1022 -> 2, 7,  73
1023 -> 3, 11, 31
1024 -> 2,  2,  2,  2,  2,  2,  2,  2,  2,  2
1025 -> 5,  5, 41
1026 -> 2,  3,  3, 19

Yếu tố nguyên tố cao nhất cho 102273, và yếu tố nguyên tố cao nhất 102619. Vì 19thấp hơn 41chúng tôi không quan tâm đến nó. Nó vẫn tăng cho các số nhỏ hơn N, vì vậy chúng tôi sẽ kiểm tra số tiếp theo theo hướng đó :

1021 -> 1021
1022 -> 2, 7,  73
1023 -> 3, 11, 31
1024 -> 2,  2,  2,  2,  2,  2,  2,  2,  2,  2
1025 -> 5,  5, 41
1026 -> 2,  3,  3, 19

1021 là một số nguyên tố và là số nguyên tố cao nhất chúng ta gặp phải, vì vậy nó sẽ được trả về.

Quy tắc:

  • Bạn sẽ chỉ nhận được tích cực Nlớn hơn 1và nhỏ hơn 2^31-2.
  • Các định dạng đầu vào và đầu ra là tùy chọn, nhưng các số phải ở cơ sở 10.
  • Bạn nên tiếp tục tìm kiếm các số nguyên tố cao hơn miễn là giá trị cao nhất đang tăng theo hướng đó. Các hướng là độc lập với nhau.

Các trường hợp thử nghiệm:

Định dạng: N, highest_factor

2, 3
3, 3
6, 7
8, 11
24, 23 
1000, 997
736709, 5417 
8469038, 9431

Giả sử chúng ta có hệ số nguyên tố cao nhất của 2N. Sau đó chúng ta nhận được 5N-1 và 61cho N + 1. Sau đó, chúng tôi nhận được 19cho N-2 và 67cho N + 2. Chúng ta nên tiếp tục thử số thấp hơn, kể từ khi 19>5hoặc dừng lại, kể từ khi 5<61? Tức là các cực đại được giữ mỗi bên? (Tôi không chắc liệu ví dụ này có khả thi về mặt toán học không.)
PurkkaKoodari

@ Pietu1998, câu hỏi bây giờ rõ ràng hơn chưa?
Stewie Griffin

N=2thực sự có vẻ là một trường hợp cạnh vì 1không có yếu tố chính, vì vậy không có yếu tố nguyên tố tối đa nào mà chúng ta có thể so sánh để quyết định xem chúng ta có nên tiếp tục hay không.
Jonathan Allan

Câu trả lời:


4

Toán học, 82 74 byte

Cảm ơn Martin Ender đã tiết kiệm 8 byte!

Max@@(±n_:=#//.x_/;l[t=x+n]>l@x:>t;l=FactorInteger[#][[-1,1]]&)/@{±-1,±1}&

Hàm không tên lấy một đầu vào số nguyên và trả về một số nguyên.

±n_:=#//.x_/;l[t=x+n]>l@x:>tđịnh nghĩa một hàm unary ±tiếp tục tăng đầu vào số nguyên của hàm toàn cầu nmiễn là hệ số nguyên tố lớn nhất đang tăng. (Hàm số nguyên tố lớn nhất được xác định bằng l=FactorInteger[#][[-1,1]]&.) {±-1,±1}Do đó áp dụng hàm đó hai lần cho số nguyên đầu vào, với số tăng -1và một lần nữa với số gia 1. Sau đó, Max@@(...l...)/@...lấy phần lớn hơn của hai phần tử nguyên tố lớn nhất được tìm thấy.

Trình trước:

Max@@(l=FactorInteger[#][[-1,1]]&)/@(#//.x_/;l[t=x+#2]>l[x]:>t&@@@{{#,-1},{#,1}})&

Đã lưu một vài byte bằng cách tránh @@@(và bạn có thể sử dụng l@xở đó):Max@@(±n_:=#//.x_/;l[t=x+n]>l@x:>t;l=FactorInteger[#][[-1,1]]&)/@{±-1,±1}&
Martin Ender

1

Perl, 137 byte

122 byte mã + 15 byte cho -p-Mntheory=:all.

sub f{$t=(factor$_+pop)[-1]}$i=$j=1;while($i|$j){f++$c;($i&=$t>$h)&&($h=$t);f-$c;($j&=$t>$l)&&($l=$t)}$_=$h>$l?$h:$l?$l:$_

Để chạy nó:

perl -pMntheory=:all -e 'sub f{$t=(factor$_+pop)[-1]}$i=$j=1;while($i|$j){f++$c;($i&=$t>$h)&&($h=$t);f-$c;($j&=$t>$l)&&($l=$t)}$_=$h>$l?$h:$l?$l:$_' <<< 736709

Nếu bạn chưa ntheorycài đặt, bạn có thể cài đặt nó bằng cách nhập (echo y;echo) | perl -MCPAN -e 'install ntheory'vào thiết bị đầu cuối của bạn.


0

Ruby, 99 byte

->n{f=->n{i=2;n%i<1?n/=i:i+=1while i<n;n};g=->s,z{s+=z while f[s+z]>b=f[s];b};[g[n,1],g[n,-1]].max}

Giải trình:

  • f () là hệ số nguyên tố cao nhất
  • g () là hàm tìm kiếm hàng xóm theo một hướng
  • áp dụng g cho (n, -1) và cho (n, + 1) để tìm kiếm theo cả hai hướng
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.