Bilangan Bulat Berlebihan

18

Untuk bilangan bulat positifn dengan faktorisasi prima di n = p1^e1 * p2^e2 * ... pk^ekmana p1,...,pkbilangan prima dan e1,...,ekbilangan bulat positif, kita dapat mendefinisikan dua fungsi:

  • Ω(n) = e1+e2+...+ekjumlah pembagi utama (dihitung dengan multiplisitas) ( A001222 )
    • ω(n) = kjumlah pembagi utama yang berbeda. ( A001221 )

Dengan dua fungsi tersebut kami mendefinisikan kelebihan e(n) = Ω(n) - ω(n) ( A046660 ). Ini dapat dianggap sebagai ukuran seberapa dekat suatu angka dengan squarefree.

Tantangan

Untuk bilangan bulat positif yang diberikan nkembali e(n).

Contohnya

Karena n = 12 = 2^2 * 3kita memiliki Ω(12) = 2+1dan ω(12) = 2dan karenanya e(12) = Ω(12) - ω(12) = 1. Untuk nomor bebas pulsa apa pun yang nkami miliki e(n) = 0. Beberapa istilah pertama adalah

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

Beberapa detail lainnya di wiki OEIS.

cacat
sumber
1
Mungkin mengklarifikasi bahwa ^itu kekuatan
Luis Mendo
5
Ini tidak perlu menurut saya. Simbol ini digunakan di sini dan di seluruh internet, serta pada banyak kalkulator dan dalam banyak bahasa pemrograman.
flawr

Jawaban:

7

MATL , 7 5 byte

Yfd~s

Cobalah online! Atau verifikasi semua kasus uji .

Penjelasan

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
sumber
Saya tidak tahu bagaimana cara factorkerjanya di MATL, really cool =)
flawr
@ flawr Maksud Anda YF(dalam versi kode 7-byte) atau Yf(5-byte)? Yang terakhir adalah seperti di MATLAB
Luis Mendo
1
Fungsi untuk eksponen, 5 byte sekarang lebih pintar =)
flawr
6

Brachylog , 11 byte

$pPd:Pr:la-

Cobalah online!

Penjelasan

$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
Fatalisasi
sumber
6

Mathematica, 23 byte

PrimeOmega@#-PrimeNu@#&

Sangat membosankan. FactorIntegersudah memakan 13 byte, dan saya tidak bisa melihat banyak yang bisa dilakukan dengan 10 sisanya.

u54112
sumber
4

Jelly , 5 byte

ÆfI¬S

Cobalah online!

Verifikasi semua testcases.

Jawaban Port of Luis Mendo di 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
Biarawati Bocor
sumber
Untuk pendekatan sebelumnya, ÆF’SṪakan bekerja saya pikir
Sp3000
@ Sp3000 Anda harus memposting itu
Leaky Nun
@ LeakyNun Saya mencoba untuk port sendiri, tetapi definisi ¬saya bingung. Saya tidak tahu itu vektor
Luis Mendo
@LuisMendo Memang dokumen Jelly berantakan.
Leaky Nun
3

05AB1E , 6 byte

Òg¹fg-

Penjelasan

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

Cobalah online!

Emigna
sumber
3

J, 11 10 byte

Disimpan 1 byte berkat Jonah .

1#.1-~:@q:
alephalpha
sumber
1
1#.1-~:@q:selama 10 byte. ide bagus menggunakan ~:btw.
Jonah
2

C, 74 byte

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

Ide itu!

Biarawati Bocor
sumber
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]

Terima kasih kepada @JonathanAllan untuk bermain golf 1 byte!

Uji di Ideone .

Dennis
sumber
Ah bagus - Anda dapat menyimpan byte dengan menggunakann/k%k<1
Jonathan Allan
Benar, n sudah habis dibagi k pada titik itu. Terima kasih!
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
Damien
sumber
jika itu satu fungsi: siapakah variabel input? siapa outputnya? terima kasih ...
RosLuP
(%) mengambil 3 variabel input: akumulator (c), integer (x) dan integer (n). Ini mengembalikan kelebihan dari (n) ketika c diatur ke 0 dan x ke 2. Jadi (0% 2) adalah fungsi parsial yang mengambil n dan mengembalikan kelebihannya
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))

Sebagian besar kode diambil oleh versi golf dari jawaban SO ini , yang menyimpan faktor utama input f. Kemudian kita cukup menggunakan set manipulasi untuk menghitung faktor berlebih.

Terima kasih kepada Leaky Nun karena telah menghemat 1 3 byte!

Tembaga
sumber
1

SILOS , 113 byte

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

Cobalah online!

Sebuah port dari saya jawaban di C .

Biarawati Bocor
sumber
Begitu dekat untuk mengalahkan C :(
Rohan Jhunjhunwala
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

Disimpan 5 byte berkat Neil

Contoh:

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
sumber
1
Anda dapat menyimpan 5 byte dengan menghitung rrekursif: 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[*]}))

Program lengkap, dengan input $1dan output ke stdout.

Kami IFSakan mulai dengan baris baru, sehingga ekspansi "${f[*]}"dipisahkan baris baru. Kami menggunakan substitusi aritmatika untuk mencetak perbedaan antara jumlah kata dalam factorisation dengan hasil penyaringan uniq. Angka itu sendiri dicetak sebagai awalan oleh factor, tetapi juga ada setelah pemfilteran, jadi keluar dalam pengurangan.

Toby Speight
sumber
0

Python, (dengan sympy) 66 byte

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

sympy.factorintmengembalikan kamus dengan faktor sebagai kunci dan kelipatannya sebagai nilai, sehingga jumlah nilai Ω(n)dan jumlah nilai ω(n), sehingga jumlah nilai yang dikurangi adalah yang kita inginkan.

Jonathan Allan
sumber
0

CJam, 11 byte

ri_mf,\mF,-

Cobalah online!

Penjelasan

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
Kucing Bisnis
sumber
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;}

Pada awalnya ada instruksi goto ... bahkan jika ini lebih panjang dari milikmu itu lebih mudah dibaca dan benar [jika saya tidak menganggap n terlalu besar ...] satu Bahasa yang memiliki fungsi perpustakaan 10.000 lebih dingin daripada Bahasa bahwa dengan sedikit, 20 atau 30 fungsi perpustakaan dapat melakukan semuanya dengan lebih baik [karena kita tidak dapat mengingat semua fungsi ini]

#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
sumber
0

GNU sed + coreutils, 55 byte

(termasuk +1 untuk -rbendera)

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

Masukan dalam desimal, pada stdin; output di unary, di stdout.

Penjelasan

#!/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
sumber
0

APL (NARS) 35 karakter, 70 byte

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

fungsi π menemukan faktorisasi dalam pokok argumennya; ada beberapa yang mengatakan itu tampak jelas, tetapi bagi saya melakukan lebih banyak operasi (dari faktorisasi) daripada minimum ... kisaran karakter hitung keluar bahasa golf karena tampaknya terlalu banyak menghitung, tetapi kurang daripada tidak golf bahasa ... uji:

  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
sumber