Số nguyên quá mức


18

Đối với một dương tính số nguyên nvới các nguyên tố n = p1^e1 * p2^e2 * ... pk^ekp1,...,pklà số nguyên tố và e1,...,eklà nguyên dương, chúng ta có thể xác định hai chức năng:

  • Ω(n) = e1+e2+...+eksố lượng ước nguyên tố (được tính bằng bội số) ( A001222 )
    • ω(n) = ksố lượng ước nguyên tố riêng biệt. ( A001221 )

Với hai hàm này, chúng tôi xác định phần thừa e(n) = Ω(n) - ω(n) ( A046660 ). Đây có thể được coi là thước đo mức độ gần gũi của một số với hình vuông.

Thử thách

Đối với một nlợi nhuận nguyên dương cho trước e(n).

Ví dụ

Đối với n = 12 = 2^2 * 3chúng ta Ω(12) = 2+1ω(12) = 2và do đó e(12) = Ω(12) - ω(12) = 1. Đối với bất kỳ số nvuông miễn phí, chúng tôi chắc chắn có e(n) = 0. Một vài điều khoản đầu tiên là

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

Một số chi tiết trong wiki OEIS.


1
Có thể làm rõ đó ^là sức mạnh
Luis Mendo

5
Điều này là không cần thiết theo ý kiến ​​của tôi. Biểu tượng này được sử dụng ở đây và trên internet, cũng như trên nhiều máy tính và trong nhiều ngôn ngữ lập trình.
flawr

Câu trả lời:


7

MATL , 7 5 byte

Yfd~s

Hãy thử trực tuyến! Hoặc xác minh tất cả các trường hợp thử nghiệm .

Giải trình

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

Tôi đã không biết làm thế nào factorhoạt động trong MATL, thực sự tuyệt vời =)
flawr

@flawr Ý bạn là YF(trong phiên bản 7 byte của mã) hay Yf(5 byte)? Sau này là như trong MATLAB
Luis Mendo

1
Hàm cho số mũ, 5 byte bây giờ thậm chí còn thông minh hơn =)
flawr

6

Brachylog , 11 byte

$pPd:Pr:la-

Hãy thử trực tuyến!

Giải trình

$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

Toán học, 23 byte

PrimeOmega@#-PrimeNu@#&

Rất nhàm chán. FactorIntegerđã chiếm 13 byte và tôi không thể thấy nhiều thứ có thể được thực hiện với 10 byte còn lại.


4

Thạch , 5 byte

ÆfI¬S

Hãy thử trực tuyến!

Xác nhận tất cả các testcase.

Câu trả lời của cảng Luis Mendo trong 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

Đối với cách tiếp cận trước đây, ÆF’SṪtôi nghĩ sẽ có hiệu quả
Sp3000

@ Sp3000 Bạn nên đăng bài đó
Leaky Nun

@LeakyNun Tôi đã cố gắng tự mình chuyển nó, nhưng định nghĩa ¬làm tôi bối rối. Tôi không biết nó được véc tơ
Luis Mendo

@LuisMendo Quả thực các tài liệu Jelly rất lộn xộn.
Nữ tu bị rò rỉ





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]

Cảm ơn @Jonathan ALLan vì đã chơi golf 1 byte!

Kiểm tra nó trên Ideone .


Thật tuyệt - bạn có thể tiết kiệm một byte bằng cách sử dụngn/k%k<1
Jonathan Allan

Phải, n đã chia hết cho k tại thời điểm đó. Cảm ơn!
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

nếu đó là một hàm: ai là biến đầu vào? đầu ra là ai cảm ơn bạn ...
RosLuP

(%) có 3 biến đầu vào: bộ tích lũy (c), số nguyên (x) và số nguyên (n). Nó trả về phần thừa của (n) khi c được đặt thành 0 và x thành 2. Vì vậy (0% 2) là hàm một phần lấy n và trả lại phần thừa của nó
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))

Hầu hết các mã được đưa lên bởi một phiên bản golf của câu trả lời SO này , nơi lưu trữ các yếu tố chính của đầu vào f. Sau đó, chúng tôi chỉ cần sử dụng thao tác thiết lập để tính toán các yếu tố dư thừa.

Cảm ơn Leaky Nun vì đã tiết kiệm 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

Đã lưu 5 byte nhờ Neil

Thí dụ:

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
Bạn có thể lưu 5 byte bằng cách tính toán rđệ quy : 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[*]}))

Hoàn thành chương trình, với đầu vào trong $1 và đầu ra cho thiết bị xuất chuẩn.

Chúng tôi thiết lập IFSđể bắt đầu với một dòng mới, để việc mở rộng "${f[*]}"được phân tách dòng mới. Chúng tôi sử dụng thay thế số học để in sự khác biệt giữa số lượng từ trong hệ số với kết quả của việc lọc qua uniq. Bản thân số được in dưới dạng tiền tố factor, nhưng nó cũng có mặt sau khi lọc, do đó rơi ra trong phép trừ.


0

Python, (có sympy) 66 byte

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

sympy.factorinttrả về một từ điển với các yếu tố là khóa và bội số của chúng là giá trị, vì vậy tổng của các giá trị là Ω(n)và số lượng giá trị là ω(n), do đó tổng các giá trị giảm là những gì chúng ta muốn.


0

CJam, 11 byte

ri_mf,\mF,-

Hãy thử trực tuyến!

Giải trình

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

Ban đầu, có hướng dẫn goto ... ngay cả khi nó dài hơn hướng dẫn của bạn thì nó cũng dễ đọc hơn và đúng [nếu tôi không coi n quá lớn ...] một Ngôn ngữ có 10000 chức năng thư viện sẽ không hoạt động hơn Ngôn ngữ rằng với một vài, 20 hoặc 30 chức năng thư viện có thể làm tốt hơn tất cả [vì chúng ta không thể nhớ tất cả các chức năng này]

#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

(bao gồm +1 cho -rcờ)

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

Đầu vào ở dạng thập phân, trên stdin; đầu ra trong unary, trên thiết bị xuất chuẩn.

Giải trình

#!/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 ký tự, 70 byte

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

hàm π tìm hệ số nhân trong số nguyên tố của đối số; Có rất ít điều để nói có vẻ rõ ràng, nhưng đối với tôi thực hiện nhiều thao tác (từ yếu tố hóa) hơn mức tối thiểu ... phạm vi của các ký tự đếm ngoài ngôn ngữ chơi golf vì nó có vẻ quá nhiều, nhưng ít hơn là không phải ngôn ngữ chơi gôn ... kiểm tra:

  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 
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.