จำนวนเต็มที่มากเกินไป


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 ) ซึ่งถือได้ว่าเป็นการวัดว่าจำนวนใกล้เคียงกับการเป็น squarefree อย่างไร

ท้าทาย

สำหรับจำนวนเต็มบวกที่ได้รับผลตอบแทนne(n)

ตัวอย่าง

สำหรับการn = 12 = 2^2 * 3ที่เรามีΩ(12) = 2+1และดังนั้นจึงω(12) = 2 e(12) = Ω(12) - ω(12) = 1สำหรับหมายเลข squarefree ใด ๆ ที่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

@flawr คุณหมายถึงYF(ในรหัสรุ่น 7 ไบต์) หรือYf(5 ไบต์)? หลังเป็นเช่นเดียวกับใน MATLAB
Luis Mendo

1
ฟังก์ชั่นสำหรับเลขชี้กำลัง, 5 ไบต์ตอนนี้ฉลาดยิ่งขึ้น =)
ข้อบกพร่อง


6

Mathematica ขนาด 23 ไบต์

PrimeOmega@#-PrimeNu@#&

น่าเบื่อมาก. FactorIntegerใช้เวลาถึง 13 ไบต์แล้วและฉันไม่สามารถเห็นได้มากนักที่เหลือ 10


4

เยลลี่ 5 ไบต์

ÆfI¬S

ลองออนไลน์!

ตรวจสอบการทดสอบทั้งหมด

ท่าเรือคำตอบที่หลุยส์ Mendo ใน 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 คุณควรโพสต์สิ่งนั้น
Nun

@LeakyNun ฉันพยายามพอร์ตด้วยตัวเอง แต่คำจำกัดความของ¬ฉันสับสน ฉันไม่รู้ว่ามันเป็น vectorized
Luis Mendo

@ LuisMendo อันที่จริงเอกสาร Jelly นั้นยุ่ง
Leun 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


อ่า - คุณสามารถบันทึก byte ได้โดยใช้n/k%k<1
Jonathan Allan

ถูกต้องnหารด้วยkณ จุดนั้นแล้ว ขอบคุณ!
Dennis

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

ถ้านั่นคือฟังก์ชั่นเดียว: ใครคือตัวแปรอินพุต? ผลลัพธ์คือใคร ขอบคุณ ...
RosLuP

(%) ใช้ตัวแปรอินพุท 3 ตัว: แอคคิวมูเลเตอร์ (c), จำนวนเต็ม (x) และจำนวนเต็ม (n) มันจะส่งกลับส่วนเกินของ (n) เมื่อ c ถูกตั้งค่าเป็น 0 และ x ถึง 2 ดังนั้น (0% 2) เป็นฟังก์ชันบางส่วนที่ใช้ n และส่งคืนส่วนที่เกิน
Damien

2

05AB1E , 4 ไบต์

Ò¥_O

ท่าเรือ@LuisMendoคำตอบ MATL 's

ลองมันออนไลน์หรือตรวจสอบครั้งแรก 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 ไบต์ขอบคุณ Neil

ตัวอย่าง:

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
Neil

1

Bash, 77 ไบต์

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

จบโปรแกรมด้วยอินพุต $1และเอาต์พุตไปยัง stdout

เราตั้งค่าIFSให้เริ่มต้นด้วยการขึ้นบรรทัดใหม่เพื่อให้การขยาย"${f[*]}"แยกบรรทัดใหม่ เราใช้ทดแทนการทางคณิตศาสตร์ในการพิมพ์ความแตกต่างระหว่างจำนวนคำใน factorisation uniqที่มีผลมาจากการกรองผ่าน ตัวเลขจะถูกพิมพ์เป็นคำนำหน้าโดยfactorแต่ก็ยังปรากฏหลังจากการกรองดังนั้นจึงตกอยู่ในการลบ


0

Python (ที่มี sympy) 66 ไบต์

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

sympy.factorintส่งคืนพจนานุกรมที่มีปัจจัยเป็นกุญแจและหลายหลากเป็นค่าดังนั้นผลรวมของค่าคือΩ(n)และจำนวนของค่าω(n)ดังนั้นผลรวมของค่าที่ลดลงคือสิ่งที่เราต้องการ



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

ในการเริ่มต้นมีคำสั่ง goto ... แม้ว่าจะมีความยาวมากกว่าของคุณมันก็อ่านได้และถูกต้อง [ถ้าฉันไม่พิจารณา n ใหญ่เกินไป ... ] หนึ่งภาษาที่มี 10,000 ไลบรารีฟังก์ชั่นนั้นแย่กว่าภาษา ที่มีน้อย, 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; เอาต์พุตใน unary บน 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 
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.