Inteiros Excessivos


18

Para um número inteiro positivon com a fatoração primária n = p1^e1 * p2^e2 * ... pk^ekonde p1,...,pksão números primos e e1,...,eknúmeros inteiros positivos, podemos definir duas funções:

  • Ω(n) = e1+e2+...+eko número de divisores primos (contados com multiplicidade) ( A001222 )
    • ω(n) = ko número de divisores primos distintos. ( A001221 )

Com essas duas funções, definimos o excesso e(n) = Ω(n) - ω(n) ( A046660 ). Isso pode ser considerado como uma medida de quão perto um número está de estar livre de quadrados.

Desafio

Para um determinado nretorno inteiro positivo e(n).

Exemplos

Para n = 12 = 2^2 * 3nós temos Ω(12) = 2+1e ω(12) = 2portanto e(12) = Ω(12) - ω(12) = 1. Para qualquer número sem quadrados, ntemos obviamente e(n) = 0. Os primeiros termos são

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

Mais alguns detalhes no wiki da OEIS.


1
Talvez esclarecer que ^é poder
Luis Mendo

5
Isso não é necessário na minha opinião. Este símbolo é usado aqui e em toda a Internet, bem como em muitas calculadoras e em muitas linguagens de programação.
flawr

Respostas:


7

MATL , 7 5 bytes

Yfd~s

Experimente online! Ou verifique todos os casos de teste .

Explicação

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

Eu não estava ciente de como factorfunciona em MATL, muito legal =)
flawr

@flawr Você quer dizer YF(na versão de 7 bytes do código) ou Yf(5 bytes)? O último é como no MATLAB
Luis Mendo

1
A função dos expoentes, o byte 5 agora é ainda mais inteligente =)
flawr

6

Braquilog , 11 bytes

$pPd:Pr:la-

Experimente online!

Explicação

$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 bytes

PrimeOmega@#-PrimeNu@#&

Muito chato. FactorIntegerjá ocupa 13 bytes e não vejo muito o que pode ser feito com os 10 restantes.


4

Gelatina , 5 bytes

ÆfI¬S

Experimente online!

Verifique todos os casos de teste.

Resposta do porto de Luis Mendo em 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

Para a abordagem anterior, ÆF’SṪteria trabalhado eu acho
SP3000

@ Sp3000 Você deve postar isso #
Leaky Nun

@LeakyNun Eu mesmo estava tentando portá-lo, mas a definição de ¬me confundiu. Eu não sabia que vetorizado
Luis Mendo

@LuisMendo De fato, os documentos da Jelly são confusos.
Leaky Nun


3

J, 11 10 bytes

Guardado 1 byte graças a Jonah .

1#.1-~:@q:

1
1#.1-~:@q:por 10 bytes. boa idéia usando ~:btw.
Jonah



2

Python 2, 57 56 bytes

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

Graças a @ JonathanAllan por jogar fora um byte!

Teste em Ideone .


Ah, bom - você pode salvar um byte usando #n/k%k<1
Jonathan Allan

Certo, n já é divisível por k nesse ponto. Obrigado!
Dennis

2

Haskell, 65 bytes

(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

se essa é uma função: quem é a variável de entrada? quem é a saída? thank u ...
RosLuP

(%) usa 3 variáveis ​​de entrada: um acumulador (c), um número inteiro (x) e um número inteiro (n). Ele retorna o excesso de (n) quando c é ajustado para 0 e X a 2. Então, (0% 2) é uma função parcial que leva n e retorna o seu excesso
Damien


1

Python 2, 100 99 98 96 bytes

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

A maior parte do código é utilizada por uma versão em golf desta resposta do SO , que armazena os principais fatores da entrada f. Então, simplesmente usamos a manipulação de conjuntos para calcular os fatores em excesso.

Agradecimentos a Leaky Nun por salvar 1 3 bytes!




1

Javascript (ES6), 53 51 46 bytes

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

Guardado 5 bytes graças a Neil

Exemplo:

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
Você pode salvar 5 bytes por meio do cálculo rde forma recursiva: f=(n,i=2)=>i<n?n%i?f(n,i+1):f(n/=i,i)+!(n%i):0.
Neil

1

Bash, 77 bytes

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

Programa completo, com entrada $1e saída para stdout.

Definimos o IFSinício de uma nova linha, para que a expansão "${f[*]}"seja separada por nova linha. Usamos substituição aritmética para imprimir a diferença entre o número de palavras na fatoração com o resultado da filtragem uniq. O número em si é impresso como prefixo por factor, mas também está presente após a filtragem; portanto, cai na subtração.


0

Python, (com sympy) 66 bytes

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

sympy.factorintretorna um dicionário com fatores como chaves e suas multiplicidades como valores; portanto, a soma dos valores é Ω(n)e o número de valores ω(n); portanto, a soma dos valores decrescentes é o que queremos.


0

CJam, 11 bytes

ri_mf,\mF,-

Experimente online!

Explicação

ri_         Get an integer from input and duplicate it
   mf,      Get the number of prime factors (with repetition)
      \     Swap top 2 elements on the stack
       mF,  Get the number of prime factors (with exponents)
          - Subtract

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

No começo, há a instrução goto ... mesmo que seja mais longa que a sua, é mais legível e correta [se eu não considerar n muito grande ...] uma linguagem que possui 10000 funções de biblioteca é mais do que uma linguagem que com poucas, 20 ou 30 funções de biblioteca podem fazer tudo melhor [porque não conseguimos lembrar de todas essas funções]

#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 bytes

(incluindo +1 para -rsinalizador)

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

Entrada em decimal, em stdin; saída em unário, em stdout.

Explicação

#!/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 caracteres, 70 bytes

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

a função π encontra a fatoração no início de seu argumento; há poucos a dizer que parece claro, mas para mim faz mais operações (da fatoração) do que o mínimo ... o intervalo de caracteres de contagem está fora dos idiomas de golfe porque parece muito contar, mas menos do que não idiomas de golfe ... teste:

  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 
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.