Надмірні цілі


18

Для додатного цілого числа nз простим розбиттям, n = p1^e1 * p2^e2 * ... pk^ekде p1,...,pkє простими числами і e1,...,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. Для будь-якого квадратного числа, яке 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
Можливо, уточнимо, що ^це сила
Луїс Мендо

5
На мою думку, це не потрібно. Цей символ використовується тут і в усьому Інтернеті, а також на багатьох калькуляторах та багатьох мовах програмування.
недолік

Відповіді:


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

Я не знав, як factorпрацює в MATL, дійсно круто =)
недолік

@flawr Ви маєте на увазі YF(у 7- байтовій версії коду) чи Yf(5-байт)? Останнє, як у MATLAB
Луїс Мендо

1
Функція для експонентів, 5 байт зараз ще розумніша =)
недолік


6

Математика, 23 байти

PrimeOmega@#-PrimeNu@#&

Дуже нудно. FactorIntegerвже займає 13 байт, і я не бачу багато що можна зробити з рештою 10.


4

Желе , 5 байт

ÆfI¬S

Спробуйте в Інтернеті!

Перевірте всі тести.

Відповідь Порту Луїса Мендо в 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

Для попереднього підходу, ÆF’SṪпрацював би я думаю
Sp3000

@ Sp3000 Ви повинні опублікувати це
Leaky Nun

@LeakyNun Я намагався перенести це сам, але визначення ¬мене збентежило. Я не знав цього векторизованого
Луїс Мендо

@LuisMendo Дійсно желейські документи є безладним.
Leaky Nun





2

Python 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]

Дякуємо @JonathanAllan за те, що виграли 1 байт!

Перевірте це на Ideone .


Ах приємно - байт можна зберегти, скориставшисьn/k%k<1
Джонатан Аллан

Правильно, n вже ділиться на k у цій точці. Спасибі!
Денніс

2

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

якщо це одна функція: хто вхідна змінна? хто є виходом? дякую u ...
RosLuP

(%) приймає 3 вхідні змінні: акумулятор (c), ціле число (x) і ціле число (n). Він повертає надлишок (n), коли c встановлено на 0, а x на 2. Отже, (0% 2) є частковою функцією, яка приймає n і повертає її надлишок
Демієн

2

05AB1E , 4 байти

Ò¥_O

Порт відповіді MATL @LuisMendo .

Спробуйте в Інтернеті або перевірте перші 15 тестових випадків .

Пояснення:

Ò       # Get all prime factors with duplicates from the (implicit) input
        # (automatically sorted from lowest to highest)
 ¥      # Get all deltas
  _     # Check if it's equal to 0 (0 becomes 1; everything else becomes 0)
   O    # Take the sum (and output implicitly)

1

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

Більшу частину коду займає гольф-версія цього відповіді ТА , в якій зберігаються основні фактори введенняf . Тоді ми просто використовуємо задані маніпуляції для обчислення надлишку факторів.

Дякуємо Leaky Nun за збереження 1 3 байтів!




1

Javascript (ES6), 53 51 46 байт

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

Збережено 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
Ви можете зберегти 5 байт шляхом обчислення rрекурсивно: f=(n,i=2)=>i<n?n%i?f(n,i+1):f(n/=i,i)+!(n%i):0.
Ніл

1

Баш, 77 байт

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

Повна програма, із введенням $1та виходом у stdout.

Ми IFSрозпочнемо з нового рядка, щоб розширення "${f[*]}"було розділене новим рядком. Ми використовуємо арифметичну підстановку для друку різниці між кількістю слів у факторизації з результатом фільтрації через uniq. Саме число друкується як префікс за допомогою factor, але воно також присутнє після фільтрації, тому випадає у відніманні.


0

Пітон, (з симпатією) 66 байт

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

sympy.factorintповертає словник з факторами як ключі та їх множинністю як значеннями, тому сума значень є, Ω(n)а число значень - ω(n)значить, сума зведених значень - це те, що ми хочемо.



0

С, 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 байт

(включаючи +1 для -rпрапора)

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

Введення в десятковій частині, на stdin; вихід в одинарний, на stdout.

Пояснення

#!/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 
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.