Komşu sayıların en büyük asal faktörü


13

Bu zorluğu ardışık olarak açıklamanın en kolay yol olduğunu düşünüyorum. Giriş numarası N ile başlayın ve:

  1. En yüksek asal faktörünü bulun
  2. Yukarıdaki ve aşağıdaki numaralar kontrol N ve en yüksek asal faktör (yani en yüksek asal faktör daha yüksek olup olmadığını görmek N-1 ve / veya N + 1 faktörü daha yüksektir N .
  3. En yüksek faktörlerin arttığı ( (N-2, N-3 ...) ve / veya (N + 2, N + 3 ...) ve benzeri yönlerde N'ye komşu olan yüksek ve / veya düşük sayıları kontrol etmeye devam edin ) üzerinde
  4. Her iki yönde de zaten bulduğumuzdan daha yüksek asal faktörler olmadığında durur ve karşılaştığımız en yüksek asal faktörü çıkarırız.

Bir örneğe bakalım:

245asal faktörleri vardır 5, 7, 7. Komşuları:

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

En yüksek asal faktör her iki yönde de artmaktadır, bu yüzden bir sonraki komşuya bakmalıyız:

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

En yüksek asal faktörler şimdi her iki yönde de azalmaktadır, bu nedenle karşılaştığımız en yüksek asal faktör 61, geri döndürülmelidir.

Başka bir örnek:

Bakalım 1024. Temel faktörleridir 2, 2, 2, 2, 2, 2, 2, 2, 2, 2. En yakın komşularının başlıca faktörleri:

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

En yüksek asal çarpan dan, hem yönde artmaktadır 2için 31ya 41. Komşulara bakalı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

İçin en yüksek asal çarpan 1022IS 73ve en yüksek asal çarpan 1026olduğunu 19. Çünkü ilgilenmediğimizden 19daha düşük 41. N'den küçük sayılar için hala artıyor, bu yüzden bir sonrakini bu yönde kontrol edeceğiz :

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 bir asal ve karşılaştığımız en yüksek asal, bu yüzden iade edilmelidir.

Kurallar:

  • Sadece daha Nbüyük 1ve daha küçük pozitif olacak 2^31-2.
  • Giriş ve çıkış biçimleri isteğe bağlıdır, ancak sayılar temel 10'da olmalıdır.
  • Bu yönde en yüksek değer arttığı sürece daha yüksek primler aramaya devam etmelisiniz. Yönler birbirinden bağımsızdır.

Test senaryoları:

Biçim: N, highest_factor

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

Diyelim ki 2N için en yüksek asal çarpanı elde ettik. Sonra 5N-1 ve 61N + 1 için. Sonra 19N-2 ve 67N + 2 için. O zamandan beri 19>5veya durmadan daha düşük sayıları denemeye devam etmeli miyiz 5<61? Yani maksimumlar her iki tarafta da tutuluyor mu? (Örneğin matematiksel olarak mümkün olup olmadığından emin değilim.)
PurkkaKoodari

@ Pietu1998, soru şimdi daha açık mı?
Stewie Griffin

N=21asal bir etken olmadığı için aslında bir son durum gibi görünüyor , bu yüzden devam edip etmememiz gerektiğine karar vermek için karşılaştırabileceğimiz maksimum asal faktör yok.
Jonathan Allan

Yanıtlar:


4

Mathematica, 82 74 bayt

Martin Ender'e 8 bayt kazandığı için teşekkürler!

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

Bir tamsayı girişi alan ve bir tamsayı döndüren isimsiz işlev.

±n_:=#//.x_/;l[t=x+n]>l@x:>ten büyük asal faktör arttığı sürece ±global fonksiyonun tamsayı girdisini artırmaya devam eden tekli bir fonksiyon tanımlar n. (En büyük asal faktör işlevi ile tanımlanır l=FactorInteger[#][[-1,1]]&.) {±-1,±1}Bu nedenle bu işlevi giriş tamsayısına iki kez, artışla -1ve tekrar artışla uygular 1. Daha sonra, Max@@(...l...)/@...bu şekilde bulunan en büyük iki ana faktörden daha büyük olanı alır.

Önceki gönderim:

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

Kaçınarak birkaç bayt kaydedildi @@@(ve l@xorada kullanabilirsiniz ):Max@@(±n_:=#//.x_/;l[t=x+n]>l@x:>t;l=FactorInteger[#][[-1,1]]&)/@{±-1,±1}&
Martin Ender

1

Perl, 137 bayt

İçin kodu + 15 bayt 122 bayt -pve -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:$_

Çalıştırmak için:

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

Eğer var yoksa ntheoryyüklü, sen yazarak yükleyebilirsiniz (echo y;echo) | perl -MCPAN -e 'install ntheory'senin terminalde.


0

Ruby, 99 bayt

->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}

Açıklama:

  • f () en yüksek ana faktördür
  • g (), komşuları bir yönde arayan işlevdir
  • her iki yönde arama yapmak için g'yi (n, -1) ve (n, + 1) tuşlarına uygulayın
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.