Aşırı Tam Sayılar


18

Bir İçin pozitif tamsayı nasal çarpanlarına sahip Asal sayılar ve pozitif tamsayılar, biz iki işlevi tanımlayabilirsiniz:n = p1^e1 * p2^e2 * ... pk^ekp1,...,pke1,...,ek

  • Ω(n) = e1+e2+...+ekasal bölenlerin sayısı ( çokluk ile sayılır) ( A001222 )
    • ω(n) = kbelirgin ana bölenlerin sayısı. ( A001221 )

Bu iki fonksiyonla fazlalığı tanımlarız e(n) = Ω(n) - ω(n)( A046660 ). Bu, bir sayının karesız olmasının ne kadar yakın olduğunun bir ölçüsü olarak düşünülebilir.

Meydan okuma

Belirli bir pozitif tamsayı ndönüşü için e(n).

Örnekler

İçin n = 12 = 2^2 * 3elimizdeki Ω(12) = 2+1ve ω(12) = 2dolayısıyla e(12) = Ω(12) - ω(12) = 1. Herhangi bir squarefree numarası için kesinlikle nvar e(n) = 0. İlk birkaç terim

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'sinde biraz daha ayrıntı.


1
Belki bunun ^güç olduğunu açıklığa kavuşturun
Luis Mendo

5
Bence bu gerekli değil. Bu sembol burada ve tüm internette, birçok hesap makinesinde ve birçok programlama dilinde kullanılır.
flawr

Yanıtlar:


7

MATL , 7 5 bayt

Yfd~s

Çevrimiçi deneyin! Veya tüm test senaryolarını doğrulayın .

açıklama

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'de nasıl çalıştığını bilmiyordum, gerçekten harika =)
Kusur

@flawr Şunu mu demek istediniz: YF(kodun 7 baytlık versiyonunda) veya Yf(5 baytlık)? İkincisi MATLAB
Luis Mendo'da


6

Brachylog , 11 bayt

$pPd:Pr:la-

Çevrimiçi deneyin!

açıklama

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

PrimeOmega@#-PrimeNu@#&

Çok sıkıcı. FactorIntegerzaten 13 bayt kaplıyor ve kalan 10 ile yapılabilecek çok fazla şey göremiyorum.


4

Jöle , 5 bayt

ÆfI¬S

Çevrimiçi deneyin!

Tüm test vakalarını doğrulayın.

Port Matl Luis Mendo cevabı .

Æ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

Önceki yaklaşım için, ÆF’SṪbence
Sp3000

@ Sp3000 Bunu göndermelisiniz
Leaky Nun

@LeakyNun Onu kendim taşımaya çalışıyordum, ama ¬beni şaşırttı . Vectorized olduğunu bilmiyordum
Luis Mendo

@LuisMendo Gerçekten de Jelly belgeleri dağınık.
Leaky Nun





2

Python 2, 57 56 bayt

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

@JonathanAllan'a 1 baytlık golf için teşekkürler!

Ideone üzerinde test edin .


Ah güzel - kullanarak bir bayt kaydedebilirsinizn/k%k<1
Jonathan Allan

Doğru, n zaten bu noktada k tarafından bölünebilir . Teşekkürler!
Dennis

2

Haskell, 65 bayt

(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

bu bir işlevse: giriş değişkeni kimdir? çıktı kim? thank u ...
RosLuP

(%) 3 giriş değişkeni alır: bir akümülatör (c), bir tam sayı (x) ve bir tam sayı (n). C 0 ve x 2'ye ayarlandığında (n) fazlalığını döndürür. Yani (0% 2) n alan ve fazlalığını döndüren kısmi bir işlevdir
Damien


1

Python 2, 100 99 98 96 bayt

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

Kodun çoğu, girdinin ana faktörlerini depolayan bu SO cevabının golf edilmiş bir versiyonu tarafından alınır f. Daha sonra, aşırı faktörleri hesaplamak için set manipülasyonunu kullanırız.

Leaky Nun'e 1 3 bayt kaydettiği için teşekkürler !




1

Javascript (ES6), 53 51 46 bayt

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

Neil sayesinde 5 bayt kurtardı

Misal:

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
Sen hesaplayarak 5 bayt kaydedebilirsiniz ryinelemeli: f=(n,i=2)=>i<n?n%i?f(n,i+1):f(n/=i,i)+!(n%i):0.
Neil

1

Bash, 77 bayt

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

Stdout'a giriş $1ve çıkış ile komple program .

Biz set IFSgenişleme böylece, bir yeni satır başlamak "${f[*]}"yeni satır ayrılmış olduğunu. Filtrelemenin sonucu ile çarpanlara ayırmadaki sözcük sayısı arasındaki farkı yazdırmak için aritmetik ikameyi kullanırız uniq. Sayının kendisi tarafından bir önek olarak yazdırılır factor, ancak filtrelemeden sonra da bulunur, bu nedenle çıkarma işlemine düşer.


0

Python (senfoni ile) 66 bayt

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

sympy.factorintanahtar olarak faktörleri ve değer olarak çarpımlarını içeren bir sözlük döndürür, bu nedenle değerlerin toplamı ve değerlerin Ω(n)sayısı ω(n), dolayısıyla azaltılmış değerlerin toplamı istediğimiz şeydir.


0

CJam, 11 bayt

ri_mf,\mF,-

Çevrimiçi deneyin!

açıklama

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

Başlangıçta goto talimatı var ... bu sizinkinden daha uzun olsa bile daha okunabilir ve doğru [n çok fazla büyük düşünmezsem ...] 10000 kütüphane fonksiyonuna sahip bir Dil bir Dil'den ibarettir birkaç, 20 veya 30 kütüphane fonksiyonuyla daha iyisini yapabilir [çünkü tüm bu fonksiyonları hatırlayamayız]

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

( -rbayrak için +1 dahil )

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

Stdin'de ondalık olarak giriş; stdout üzerinde tekli çıktı.

açıklama

#!/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 karakter, 70 bayt

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

fonksiyon arg çarpanlara ayırmayı argümanının başında bulması; net göründüğünü söyleyecek çok az şey var, ama benim için minimumdan daha fazla işlem (çarpanlara ayırma) yapıyor ... sayı karakterleri aralığı golf dillerinden çıktı çünkü çok fazla sayılıyor, ancak golf dillerinden daha az değil ... Ölçek:

  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 
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.