過剰な整数


18

以下のために正の整数をn素因数分解して素数であると正の整数であり、我々は2つの機能を定義することができます。n = p1^e1 * p2^e2 * ... pk^ekp1,...,pke1,...,ek

  • Ω(n) = e1+e2+...+ek素数の数(多重度でカウント)(A001222
    • ω(n) = k異なる素因数の数。(A001221

これらの2つの関数を使用して、超過 を定義しますe(n) = Ω(n) - ω(n)A046660)。これは、数値がどのくらい正方形に近いかを示す尺度と見なすことができます。

チャレンジ

与えられた正の整数をn返しe(n)ます。

以下のためにn = 12 = 2^2 * 3、私たちは持っているΩ(12) = 2+1し、ω(12) = 2そのためe(12) = Ω(12) - ω(12) = 1。任意の平方数について、n私たちは明らかに持っていe(n) = 0ます。最初のいくつかの用語は

1       0
2       0
3       0
4       1
5       0
6       0
7       0
8       2
9       1
10      0
11      0
12      1
13      0
14      0
15      0

OEIS wikiに詳細があります。


1
たぶんそれ^が力であることを明確に
ルイスメンドー

5
私の意見ではこれは必要ありません。このシンボルは、ここやインターネット全体、および多くの計算機や多くのプログラミング言語で使用されています。
-flawr

回答:


7

MATL7 5バイト

Yfd~s

オンラインでお試しください!または、すべてのテストケースを確認します

説明

Yf    % Implicit input. Obtain prime factors, sorted and with repetitions
d     % Consecutive differences
~     % Logical negate: zeros become 1, nonzeros become 0
s     % Sum. Implicit display

私はどのように認識していなかったfactor)= MATLでの作品は、本当にクール
flawr

@flawr YF(コードの7バイトバージョンで)またはYf(5バイト)という意味ですか?後者は、MATLABの場合
ルイスメンドー

1
指数の関数、5バイトがさらに巧妙になりました=)
flawr

6

Brachylog、11バイト

$pPd:Pr:la-

オンラインでお試しください!

説明

$pP            P is the list of prime factors of the Input
  Pd           Remove all duplicates in P
    :Pr        Construct the list [P, P minus duplicates]
       :la     Apply "length" to the two elements of that list
          -    Output is the subtraction of the first element by the second one

6

Mathematica、23バイト

PrimeOmega@#-PrimeNu@#&

非常に退屈。FactorIntegerすでに13バイトを占有しており、残りの10バイトでできることはほとんどわかりません。


4

ゼリー、5バイト

ÆfI¬S

オンラインでお試しください!

すべてのテストケースを検証します。

ポートオブルイスメンドーのMATLでの回答

ÆfI¬S

Æf     Implicit input. Obtain prime factors, sorted and with repetitions
  I    Consecutive differences
   ¬   Logical negate: zeros become 1, nonzeros become 0
    S  Sum. Implicit display

以前のアプローチでÆF’SṪは、私が思うに働いていただろう
-Sp3000

@ Sp3000それを投稿する必要があります
リーキー修道女

@LeakyNun私はそれを自分で移植しようとしましたが、定義は¬混乱しました。ベクトル化されたことを知りませんでした
ルイスメンドー

@LuisMendo実際、Jellyのドキュメントは乱雑です。
リーキー修道女





2

パイソン2、57の 56バイト

f=lambda n,k=2:n/k and[f(n,k+1),(n/k%k<1)+f(n/k)][n%k<1]

@JonathanAllanが1バイトのゴルフをしてくれてありがとう!

Ideoneでテストします。


ああ-を使用してバイトを保存できますn/k%k<1
ジョナサンアラン

右、nはその時点で既にkで割り切れます。ありがとう!
デニス

2

Haskell、65バイト

(c%x)n|x>n=c|mod n x>0=c%(x+1)$n|y<-div n x=(c+0^mod y x)%x$y
0%2

それが1つの関数である場合:入力変数は誰ですか?出力は誰ですか?ありがとう
...-RosLuP

(%)は、3つの入力変数(アキュムレーター(c)、整数(x)、整数(n))を取ります。cは0に設定され、2だから(0~2%)のXがNとり、その過剰を返す部分関数である場合には(N)の過剰を返す
ダミアン


1

Python 2、100 99 98 96バイト

n=input()
i=2
f=[]
while i<n:
 if n%i:i+=1
 else:n/=i;f+=i,
if-~n:f+=n,
print len(f)-len(set(f))

ほとんどのコードは、ゴルフバージョンの このSO回答のいますf。次に、セット操作を使用して、過剰係数を計算します。

1 3バイトを節約してくれたLeaky Nunに感謝します!




1

Javascript(ES6)、53 51 46バイト

e=(n,i=2)=>i<n?n%i?e(n,i+1):e(n/=i,i)+!(n%i):0

ニールのおかげで5バイト節約

例:

e=(n,i=2)=>i<n?n%i?e(n,i+1):e(n/=i,i)+!(n%i):0

// computing e(n) for n in [1, 30]
for(var n = 1, list = []; n <= 30; n++) {
  list.push(e(n));
}
console.log(list.join(','));


1
r再帰的に計算することにより、5バイトを節約できますf=(n,i=2)=>i<n?n%i?f(n,i+1):f(n/=i,i)+!(n%i):0
ニール

1

Bash、77バイト

IFS=$'\n '
f=(`factor $1`)
g=(`uniq<<<"${f[*]}"`)
echo $((${#f[*]}-${#g[*]}))

入力を含む完全なプログラム $1を標準出力に出力する。

IFS拡張"${f[*]}"が改行で区切られるように、改行で開始するように設定します。算術代入を使用して、因数分解の単語数とのフィルタリング結果との差を出力しますuniq。番号自体は、接頭辞としてによって出力されますがfactor、フィルタリング後にも存在するため、減算で除外されます。


0

Python、(sympyを使用)66バイト

import sympy;lambda n:sum(x-1for x in sympy.factorint(n).values())

sympy.factorintは、因子をキーとして、その多重度を値として持つ辞書を返します。したがって、値の合計はであり、値Ω(n)の数はω(n)であるため、減分された値の合計が必要なものになります。



0

C、158

#define G(a,b) if(a)goto b
#define R return
f(n,i,j,o,w){if(!n)R 0;o=w=i=j=0;a:i+=2;b:if(n%i==0){++j;G(n/=i,b);}o+=!!j;w+=j;i+=(i==2);j=0;G(i*i<n,a);R w-o;}

最初にgoto命令があります...これがあなたのものより長くても、より読みやすく、正しい[nが大きすぎると思わない場合...] 10000個のライブラリ関数を持つ1つの言語は、言語よりもひどいです少数、20、または30のライブラリー関数ですべてを改善できること[これらの関数すべてを思い出せないため]

#define F for
#define P printf

main(i,r)
{F(i=0; i<100; ++i)
   r=f(i,0,0,0,0),P("[%u|%u]",i,r);
 R  0;
}

/*
 158
 [0|0][1|0][2|0][3|0][4|1][5|0][6|0][7|0][8|2]
 [9|0][10|0][11|0][12|1][13|0][14|0][15|0][16|3]
 [17|0][18|0][19|0][20|1][21|0][22|0][23|0][24|2][25|1][26|0][27|0] [28|1]
 [29|0][30|0][31|0][32|4][33|0][34|0][35|0][36|1]
 [37|0][38|0][39|0][40|2][41|0]
 */

0

GNU sed + coreutils、55バイト

-rフラグの+1を含む)

s/^/factor /e
s/ ([^ ]+)(( \1)*)/\2/g
s/[^ ]//g
y/ /1/

stdinでの10進数の入力。単項出力、標準出力。

説明

#!/bin/sed -rf

# factor the number
s/^/factor /e
# remove first of each number repeated 0 or more times
s/ ([^ ]+)(( \1)*)/\2/g
# count just the spaces
s/[^ ]//g
y/ /1/

0

APL(NARS)35文字、70バイト

{⍵=1:0⋄k-⍨+/+/¨{w=⍵⊃v}¨⍳k←≢v←∪w←π⍵}

関数πは、引数の素数で因数分解を見つけます。はっきりしていると言うことはほとんどありませんが、私にとっては最小化よりも多くの操作を行います(因数分解から)...カウント文字の範囲はゴルフ言語を超えていますテスト:

  f←{⍵=1:0⋄k-⍨+/+/¨{w=⍵⊃v}¨⍳k←≢v←∪w←π⍵}
  f¨1..15
0 0 0 1 0 0 0 2 1 0 0 1 0 0 0 
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.