과도한 정수


18

A의 양의 정수 n주요 인수 분해와 소수이며, 양의 정수를, 우리는 두 가지 기능을 정의 할 수 있습니다 :n = p1^e1 * p2^e2 * ... pk^ekp1,...,pke1,...,ek

  • Ω(n) = e1+e2+...+ek소수의 제수 (다수로 계산) ( A001222 )
    • ω(n) = k구별되는 소수의 제수 ( A001221 )

이 두 함수를 사용하여 초과분 을 정의합니다 e(n) = Ω(n) - ω(n)( A046660 ). 이것은 숫자에 제곱이없는 정도를 나타내는 척도로 간주 할 수 있습니다.

도전

주어진 양의 정수를 n반환 e(n)합니다.

들어 n = 12 = 2^2 * 3우리는이 Ω(12) = 2+1ω(12) = 2따라서 e(12) = Ω(12) - ω(12) = 1. 모든 squarefree 수에 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 위키에 더 자세한 내용이 있습니다.


1
어쩌면 그것은 ^힘 이라는 것을 분명히 알 수 있습니다
Luis Mendo

5
내 의견으로는 이것은 필요하지 않습니다. 이 기호는 많은 계산기와 많은 프로그래밍 언어뿐만 아니라 인터넷 전체에서 사용됩니다.
flawr

답변:


7

MATL , 7 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

factorMATL에서 어떻게 작동 하는지 잘
몰랐습니다.

@flawr YF(코드의 7 바이트 버전) 또는 Yf(5 바이트)을 의미합니까? 후자는 MATLAB에서와 같이
Luis Mendo

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

매스 매 티카, 23 바이트

PrimeOmega@#-PrimeNu@#&

매우 지루한. FactorInteger이미 13 바이트를 차지하고 나머지 10으로 할 수있는 것을 많이 볼 수 없습니다.


4

젤리 , 5 바이트

ÆfI¬S

온라인으로 사용해보십시오!

모든 테스트 케이스를 확인하십시오.

MATL의 Port of Luis Mendo의 답변 .

Æ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 당신은 그것을 게시해야합니다
Leaky Nun

@LeakyNun 나는 그것을 직접 포팅하려고했지만, 정의가 ¬나를 혼란스럽게했다. 나는 그것이 벡터화되는 것을 몰랐다
Luis Mendo

@LuisMendo 실제로 Jelly 문서는 지저분합니다.
Leaky Nun


3

J, 11 10 바이트

Jonah 덕분에 1 바이트를 절약했습니다 .

1#.1-~:@q:

1
1#.1-~:@q:10 바이트 ~:btw를 사용하는 것이 좋습니다 .
요나



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]

1 바이트를 골프로 해준 @JonathanAllan에게 감사합니다!

Ideone에서 테스트하십시오 .


아 좋은-당신은 사용하여 바이트를 절약 할 수 있습니다n/k%k<1
Jonathan Allan

맞습니다. n 은 이미 그 시점에서 k 로 나눌 수 있습니다. 감사!
Dennis

2

하스켈, 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

이것이 하나의 함수 인 경우 : 입력 변수는 누구입니까? 출력은 누구입니까? 감사합니다 ...
RosLuP

(%)는 누산기 (c), 정수 (x) 및 정수 (n)의 3 가지 입력 변수를 사용합니다. c를 0으로 설정하고 x를 2로 설정하면 초과 (n)을 반환합니다. 따라서 (0 % 2)는 n을 취하고 초과를 반환하는 부분 함수입니다.
Damien


1

파이썬 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

자바 스크립트 (ES6), 53 51 46 바이트

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

Neil 덕분에 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.
Neil

1

배쉬, 77 바이트

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

입력 $1과 출력을 stdout으로하는 완전한 프로그램 .

우리 IFS는 개행으로 시작하여 확장 "${f[*]}"이 개행으로 분리되도록 설정했습니다. 우리는 산술 대체를 사용하여를 통해 필터링 한 결과와 인수 분해의 단어 수의 차이를 인쇄합니다 uniq. 숫자 자체는로 접두사로 인쇄 factor되지만 필터링 후에도 존재하므로 뺄셈에 빠집니다.


0

Python, (syppy 포함) 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 개의 라이브러리 함수를 가진 하나의 언어는 언어보다 무겁습니다. 라이브러리 함수가 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.