Nadmierne liczby całkowite

18

Dla dodatniej liczby całkowitej nz rozkładem liczb pierwszych, n = p1^e1 * p2^e2 * ... pk^ekgdzie p1,...,pksą liczbami e1,...,ekcałkowitymi i dodatnimi liczbami całkowitymi, możemy zdefiniować dwie funkcje:

  • Ω(n) = e1+e2+...+ekliczba głównych dzielników (liczona jako wielokrotność) ( A001222 )
    • ω(n) = kliczba wyraźnych głównych dzielników. ( A001221 )

Za pomocą tych dwóch funkcji definiujemy nadwyżkę e(n) = Ω(n) - ω(n) ( A046660 ). Można to uznać za miarę zbliżenia liczby do liczby kwadratowej.

Wyzwanie

Dla danego dodatniego nzwrotu liczby całkowitej e(n).

Przykłady

Dla n = 12 = 2^2 * 3mamy Ω(12) = 2+1i ω(12) = 2i dlatego e(12) = Ω(12) - ω(12) = 1. Dla każdej liczby nwolnej od kwadratów mamy oczywiście e(n) = 0. Pierwsze kilka warunków to

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

Więcej szczegółów na wiki OEIS.

wada
źródło
1
Może wyjaśnij, że ^to potęga
Luis Mendo
5
Moim zdaniem nie jest to konieczne. Ten symbol jest używany tutaj i w całym Internecie, a także w wielu kalkulatorach i wielu językach programowania.
flawr

Odpowiedzi:

7

MATL , 7 5 bajtów

Yfd~s

Wypróbuj online! Lub sprawdź wszystkie przypadki testowe .

Wyjaśnienie

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
Luis Mendo
źródło
Nie wiedziałem, jak factordziała MATL, naprawdę fajnie =)
flawr
@flawr Czy masz na myśli YF(w 7-bajtowej wersji kodu) czy Yf(5-bajtowa)? Ten ostatni jest jak w MATLAB
Luis Mendo
1
Funkcja dla wykładników, 5 bajtów jest teraz jeszcze bardziej sprytna =)
flawr
6

Brachylog , 11 bajtów

$pPd:Pr:la-

Wypróbuj online!

Wyjaśnienie

$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
Fatalizować
źródło
6

Mathematica, 23 bajty

PrimeOmega@#-PrimeNu@#&

Bardzo nudny. FactorIntegerzajmuje już 13 bajtów i nie widzę wiele, co można zrobić z pozostałymi 10.

u54112
źródło
4

Galaretka , 5 bajtów

ÆfI¬S

Wypróbuj online!

Sprawdź wszystkie przypadki testowe.

Port w odpowiedzi Luisa Mendo w Mátl .

Æ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
Leaky Nun
źródło
ÆF’SṪ
Wydaje
@ Sp3000 Powinieneś to opublikować
Leaky Nun
@LeakyNun Próbowałem to przenieść, ale definicja ¬mnie zdezorientowała. Nie wiedziałem, że to wektoryzacja
Luis Mendo
@LuisMendo Rzeczywiście dokumenty Jelly są niechlujne.
Leaky Nun
3

05AB1E , 6 bajtów

Òg¹fg-

Wyjaśnienie

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

Wypróbuj online!

Emigna
źródło
3

J, 11 10 bajtów

Zaoszczędził 1 bajt dzięki Jonaszowi .

1#.1-~:@q:
alephalpha
źródło
1
1#.1-~:@q:na 10 bajtów. fajny pomysł za pomocą ~:btw.
Jonasz
2

C, 74 bajty

f(n,e,r,i){r=0;for(i=2;n>1;i++,r+=e?e-1:e)for(e=0;n%i<1;e++)n/=i;return r;}

Ideone to!

Leaky Nun
źródło
2

Python 2, 57 56 bajtów

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

Dzięki @JonathanAllan za grę w golfa na 1 bajcie!

Przetestuj na Ideone .

Dennis
źródło
Ach miło - możesz zaoszczędzić bajt, używającn/k%k<1
Jonathan Allan
Racja, n jest już w tym punkcie podzielne przez k . Dzięki!
Dennis
2

Haskell, 65 bajtów

(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
Damien
źródło
jeśli jest to jedna funkcja: kim jest zmienna wejściowa? kto jest wyjściem? dziękuję ...
RosLuP
(%) przyjmuje 3 zmienne wejściowe: akumulator (c), liczbę całkowitą (x) i liczbę całkowitą (n). Zwraca nadmiar (n), gdy c jest ustawione na 0, a x na 2. Zatem (0% 2) jest funkcją częściową, która przyjmuje n i zwraca swój nadmiar
Damien
1

Python 2, 100 99 98 96 bajtów

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

Większość kodu zajmuje wersja gry w golfa tej odpowiedzi SO , która przechowuje główne czynniki wejściowe f. Następnie po prostu używamy manipulacji zestawem, aby obliczyć współczynniki nadmiaru.

Dzięki Leaky Nun za zaoszczędzenie 13 bajtów!

Miedź
źródło
1

SILOS , 113 bajtów

readIO
t=2
lbla
e=0
GOTO b
lblc
i/t
e+1
lblb
m=i
m%t
n=1
n-m
if n c
d=e
d/d
e-d
r+e
A=i
A-1
t+1
if A a
printInt r

Wypróbuj online!

Port mojej odpowiedzi w C .

Leaky Nun
źródło
Tak blisko pokonania C :(
Rohan Jhunjhunwala
1

JavaScript (ES6), 53 51 46 bajtów

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

Zaoszczędź 5 bajtów dzięki Neilowi

Przykład:

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(','));

Arnauld
źródło
1
Możesz zaoszczędzić 5 bajtów poprzez obliczenie rrekurencyjnie: f=(n,i=2)=>i<n?n%i?f(n,i+1):f(n/=i,i)+!(n%i):0.
Neil
1

Bash, 77 bajtów

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

Kompletny program z wejściem $1i wyjściem na standardowe wyjście.

Postawiliśmy IFSna początku nowej linii, tak że rozszerzenie "${f[*]}"jest nowej linii oddzielone. Używamy podstawienia arytmetycznego, aby wydrukować różnicę między liczbą słów w faktoryzacji z wynikiem filtrowania uniq. Sama liczba jest drukowana jako przedrostek factor, ale jest także obecna po filtrowaniu, więc wypada odejmując.

Toby Speight
źródło
0

Python (z sympią) 66 bajtów

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

sympy.factorintzwraca słownik z czynnikami takimi jak klucze i ich wielokrotności jako wartości, więc suma wartości jest, Ω(n)a liczba wartości jest ω(n), więc suma wartości pomniejszonych jest tym, czego chcemy.

Jonathan Allan
źródło
0

CJam, 11 bajtów

ri_mf,\mF,-

Wypróbuj online!

Wyjaśnienie

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
Business Cat
źródło
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;}

Na początku jest instrukcja goto ... nawet jeśli jest ona dłuższa niż twoja, jest bardziej czytelna i właściwa [jeśli nie uważam, że jest zbyt duża ...] jeden język, który ma 10000 funkcji bibliotecznych, jest przewartościowany niż język że przy kilku, 20 lub 30 funkcjach bibliotecznych można zrobić wszystko lepiej [ponieważ nie pamiętamy wszystkich tych funkcji]

#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]
 */
RosLuP
źródło
0

GNU sed + coreutils, 55 bajtów

(w tym +1 za -rflagę)

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

Wprowadzanie dziesiętne, na standardowe; wyjście w jednym, na standardowym wyjściu.

Wyjaśnienie

#!/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/
Toby Speight
źródło
0

APL (NARS) 35 znaków, 70 bajtów

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

funkcja π znajduje rozkład na czynniki pierwsze w argumencie; mało kto mówi, że wydaje się to jasne, ale dla mnie wykonuje więcej operacji (od faktoryzacji) niż minimum ... zakres znaków liczenia jest obecnie w golfie, ponieważ wydaje się, że jest to zbyt wiele, ale mniej niż języki golfa ... 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 
RosLuP
źródło