隣接する数の最高の素因数


13

この課題を順番に説明するのが最も簡単だと思います。入力番号Nから始めて、次のことを行います。

  1. 最高の素因数を見つける
  2. 上記と下の数字をチェックNを、最高の素因数が高いかどうかを確認(すなわち最高の素因数N-1および/またはN + 1が倍以上であるN
  3. より高いチェックし続け、および/または隣接する数字低下Nを最高要因が増加される方向での((N-2、N-3 ...)及び/又は(N + 2、N + 3···)などオン)
  4. どちらの方向にも、すでに見つけたものよりも高い素因数がなくなると、遭遇した最高の素因数を停止して出力します。

例を見てみましょう:

245素因数があり5, 7, 7ます。その隣人は次のとおりです。

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

最高の素因数は両方向に増加しているため、次の隣接要素を調べる必要があります。

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

最高の素因数は両方向で減少しているため、遭遇した最高の素因数は61であり、したがって返されるべきです。

もう一つの例:

を見てみましょう1024。その主な要因は2, 2, 2, 2, 2, 2, 2, 2, 2, 2です。最近傍の素因数は次のとおりです。

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

最高の素因数から、両方の方向に増加している23141。隣人を見てみましょう:

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

の最高の素因数102273であり、の最高の素因数102619です。以来は19より低くなっている41、我々はそれに興味を持っていないです。Nより小さい数ではまだ増加しているので、その方向の次のものを確認します

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 は素数であり、私たちが遭遇した最高の素数なので、返されるべきです。

ルール:

  • あなたは、よりN大きく1、より小さくのみ正になり2^31-2ます。
  • 入力形式と出力形式はオプションですが、数字は10進数でなければなりません。
  • 最高値がその方向に増加している限り、より高い素数の検索を続ける必要があります。方向は互いに独立しています。

テストケース:

フォーマット: N, highest_factor

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

2Nに対して最高の素因数を得たとしましょう。それ5からN-1と61N + 1に対して得ます。次に19、N-2と67N + 2 を取得します。我々は、下の数字をしようとしているので維持する必要があります19>5から、または停止5<61?すなわち、最大値はサイドごとに保持されますか?(例が数学的に可能かどうかは
わかり

@ Pietu1998、質問は今より明確ですか?
スチューウィーグリフィン

N=21素因数がないため、実際にはエッジケースのようです。したがって、続行するかどうかを判断するために比較できる最大素因数はありません。
ジョナサンアラン

回答:


4

Mathematica、82 74バイト

8バイトを節約してくれたMartin Enderに感謝します!

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

名前のない関数が整数入力を受け取り、整数を返します。

±n_:=#//.x_/;l[t=x+n]>l@x:>t最大素数が増加する限り±、グローバル関数の整数入力を増加し続ける単項関数を定義しnます。(最大の素因数関数はl=FactorInteger[#][[-1,1]]&。で定義されます。){±-1,±1}したがって、その関数を入力整数に2回適用-1します1。次に、Max@@(...l...)/@...このようにして見つかった2つの最大の素因数のうち大きい方を取ります。

以前の提出:

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

回避することで数バイトを節約しました@@@(そしてl@xそこで使用できます):Max@@(±n_:=#//.x_/;l[t=x+n]>l@x:>t;l=FactorInteger[#][[-1,1]]&)/@{±-1,±1}&
マーティンエンダー

1

Perl、137バイト

-pおよびの122バイトのコード+ 15バイト-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:$_

実行するには:

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

ntheoryインストールしていない場合(echo y;echo) | perl -MCPAN -e 'install ntheory'は、ターミナルに入力してインストールできます。


0

ルビー、99バイト

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

説明:

  • f()は最高の素因数です
  • g()は一方向の近傍を検索する関数です
  • gを(n、-1)と(n、+ 1)に適用して両方向で検索する
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.