Numeri interi eccessivi


18

Per un numero intero positivon con la scomposizione n = p1^e1 * p2^e2 * ... pk^ekin fattori primi dove p1,...,pksono numeri primi e e1,...,eknumeri interi positivi, possiamo definire due funzioni:

  • Ω(n) = e1+e2+...+ekil numero di divisori primi (contati con molteplicità) ( A001222 )
    • ω(n) = kil numero di divisori primi distinti. ( A001221 )

Con queste due funzioni definiamo l' eccesso e(n) = Ω(n) - ω(n) ( A046660 ). Questo può essere considerato come una misura di quanto è vicino un numero a essere quadrato libero.

Sfida

Per un dato nritorno intero positivo e(n).

Esempi

Perché n = 12 = 2^2 * 3abbiamo Ω(12) = 2+1e ω(12) = 2e quindi e(12) = Ω(12) - ω(12) = 1. Per ogni numero nquadrato che abbiamo ovviamente e(n) = 0. I primi termini sono

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

Alcuni dettagli in più nel wiki di OEIS.


1
Forse chiarire che ^è potere
Luis Mendo,

5
Questo non è necessario secondo me. Questo simbolo viene utilizzato qui e su Internet, nonché su molti calcolatori e in molti linguaggi di programmazione.
Flawr,

Risposte:


7

MATL , 7 5 byte

Yfd~s

Provalo online! Oppure verifica tutti i casi di test .

Spiegazione

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

Non sapevo come factorfunzionasse in MATL, davvero cool =)
flawr,

@flawr Intendi YF(nella versione a 7 byte del codice) o Yf(5 byte)? Quest'ultimo è come in MATLAB
Luis Mendo,

1
La funzione per gli esponenti, il 5 byte ora è ancora più intelligente =)
flawr

6

Brachylog , 11 byte

$pPd:Pr:la-

Provalo online!

Spiegazione

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

PrimeOmega@#-PrimeNu@#&

Molto noioso. FactorIntegeroccupa già 13 byte e non riesco a vedere molto che si possa fare con i restanti 10.


4

Gelatina , 5 byte

ÆfI¬S

Provalo online!

Verifica tutti i test.

La risposta di Port of Luis Mendo in 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

Per l'approccio precedente, ÆF’SṪavrei funzionato credo
Sp3000,

@ Sp3000 Dovresti pubblicarlo
Leaky Nun,

@LeakyNun Stavo cercando di portarlo da solo, ma la definizione di ¬mi ha confuso. Non lo sapevo vettorializzato
Luis Mendo,

@LuisMendo In effetti i documenti di Jelly sono disordinati.
Leaky Nun,

3

05AB1E , 6 byte

Òg¹fg-

Spiegazione

Òg      # number of prime factors with duplicates
     -  # minus
  ¹fg   # number of prime factors without duplicates

Provalo online!





2

Python 2, 57 56 byte

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

Grazie a @JonathanAllan per il golf off 1 byte!

Provalo su Ideone .


Ah bello - puoi salvare un byte usandon/k%k<1
Jonathan Allan il

A destra, n è già divisibile per k in quel punto. Grazie!
Dennis,

2

Haskell, 65 byte

(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 questa è una funzione: chi è la variabile di input? chi è l'output? grazie ...
RosLuP,

(%) accetta 3 variabili di input: un accumulatore (c), un numero intero (x) e un numero intero (n). Restituisce l'eccesso di (n) quando c è impostato su 0 e x su 2. Quindi (0% 2) è una funzione parziale che accetta n e restituisce il suo eccesso
Damien


1

Python 2, 100 99 98 96 byte

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

Gran parte del codice è ripreso da una versione golfata di questa risposta SO , che memorizza i fattori primi dell'input f. Quindi usiamo semplicemente la manipolazione impostata per calcolare i fattori in eccesso.

Grazie a Leaky Nun per aver salvato 1 3 byte!




1

Javascript (ES6), 53 51 46 byte

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

5 byte salvati grazie a Neil

Esempio:

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
È possibile salvare 5 byte calcolando rin modo ricorsivo: f=(n,i=2)=>i<n?n%i?f(n,i+1):f(n/=i,i)+!(n%i):0.
Neil,

1

Bash, 77 byte

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

Programma completo, con input in $1e output su stdout.

Abbiamo impostato IFSper cominciare una nuova riga, in modo che l'espansione "${f[*]}"è newline separati. Usiamo la sostituzione aritmetica per stampare la differenza tra il numero di parole nella fattorizzazione con il risultato del filtraggio uniq. Il numero stesso viene stampato come prefisso da factor, ma è presente anche dopo il filtraggio, quindi cade nella sottrazione.


0

Python, (con sympy) 66 byte

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

sympy.factorintrestituisce un dizionario con fattori come chiavi e le loro molteplicità come valori, quindi la somma dei valori è Ω(n)e il numero di valori è ω(n), quindi la somma dei valori decrementati è ciò che vogliamo.


0

CJam, 11 byte

ri_mf,\mF,-

Provalo online!

Spiegazione

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

All'inizio c'è l'istruzione goto ... anche se questa è più lunga della tua è più leggibile e giusta [se non considero n troppo grande ...] una lingua che ha 10000 funzioni di libreria è più semplice di una lingua che con poche, 20 o 30 funzioni di libreria può fare tutto meglio [perché non possiamo ricordare tutte queste funzioni]

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

(incluso +1 per la -rbandiera)

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

Immissione in decimale, su stdin; uscita in unario, su stdout.

Spiegazione

#!/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 caratteri, 70 byte

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

la funzione π trova la fattorizzazione in primo piano del suo argomento; c'è poco da dire che sembra chiaro, ma per me fa più operazioni (dalla fattorizzazione) rispetto al minimo ... la gamma di caratteri di conteggio è fuori dalle lingue del golf perché sembra contare troppo, ma meno delle lingue da golf ... test:

  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 
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.