คำนวณฟังก์ชั่น totient ของออยเลอร์


27

พื้นหลัง

ออยเลอร์totient ฟังก์ชั่นφ(n)ถูกกำหนดให้เป็นจำนวนตัวเลขทั้งหมดน้อยกว่าหรือเท่ากับnว่ามีความสำคัญในการnที่เป็นจำนวนของค่าเป็นไปได้ของxในที่0 < x <= n gcd(n, x) == 1เราได้มี ไม่กี่totient - เกี่ยวข้องกับความท้าทาย ก่อน แต่ไม่เคยหนึ่งซึ่งเป็นเพียงการคำนวณมัน

การทำแผนที่ของ totient ฟังก์ชันบนตัวเลขทั้งหมดเป็นOEIS A000010

ท้าทาย

ได้รับจำนวนเต็มคำนวณn > 0 φ(n)คุณสามารถรับอินพุตผ่านอาร์กิวเมนต์บรรทัดคำสั่งอินพุตมาตรฐานอาร์กิวเมนต์ฟังก์ชันหรืออะไรก็ได้ที่สมเหตุสมผล คุณสามารถให้เอาต์พุตผ่านเอาต์พุตมาตรฐานค่าส่งคืนหรือสิ่งอื่นที่เหมาะสม ฟังก์ชั่นที่ไม่ระบุชื่อเป็นที่ยอมรับ คุณอาจสมมติว่าการป้อนข้อมูลจะไม่ล้นวิธีธรรมชาติของการจัดเก็บจำนวนเต็มเช่นintใน C แต่คุณต้องรองรับการป้อนข้อมูลได้ถึง 255 หากภาษาของคุณมีฟังก์ชั่น Totient ในตัวคุณไม่สามารถใช้งานได้

ตัวอย่าง

φ(1) => 1
φ(2) => 1
φ(3) => 2
φ(8) => 4
φ(9) => 6
φ(26) => 12
φ(44) => 20
φ(105) => 48

คำตอบที่สั้นที่สุดในการชนะไบต์ หากภาษาของคุณใช้การเข้ารหัสที่ไม่ใช่ UTF-8 ให้พูดถึงมันในคำตอบของคุณ


4
เมื่อวานนี้ก็มีเช่นกัน ฉันไม่คิดว่าแอปพลิเคชันที่ทำซ้ำสร้างความแตกต่างอย่างเพียงพอ แต่ถ้ามีสิ่งใดที่ฉันจะปิดแอปพลิเคชันอื่นเนื่องจากฉันไม่คิดว่าแอปพลิเคชันที่ทำซ้ำจะเพิ่มอะไรอีก ที่กล่าวว่าความแตกต่างที่ใหญ่กว่าคือคนที่ได้รับอนุญาตภายในตัวและไม่
Martin Ender

การไม่อนุญาตบิวด์อินจะไม่ส่งผลกระทบต่อคำตอบ
Julie Pelletier

2
@JuliePelletier ทำไมถึงเป็นเช่นนั้น คำตอบ Mathematica ของฉันจะเป็นอย่างอื่นได้ 19 ไบต์สั้น:EulerPhi
มาร์ตินเอนเดอร์

@JuliePelletier GCD ได้รับอนุญาตเนื่องจากการคำนวณ GCD ไม่ใช่ปัญหาที่ตั้งใจจะแก้ไข แน่นอนว่ามันอาจชนจำนวนไบต์ขึ้นอยู่กับคำตอบเหล่านี้ แต่มันก็ไม่ได้ทำให้ความท้าทายดีขึ้น ฉันจะแก้ไขเพื่อชี้แจง
bkul

คำตอบ:


13

Mathematica, 27 22 ไบต์

Range@#~GCD~#~Count~1&

ฟังก์ชันที่ไม่มีชื่อที่รับและส่งคืนจำนวนเต็ม

ไม่มากที่จะอธิบายที่นี่ยกเว้นว่า@เป็นคำนำหน้าสัญกรณ์สำหรับการเรียกใช้ฟังก์ชั่นและ~...~เป็นสัญกรณ์มัด (ซ้าย - สัมพันธ์) ดังนั้นด้านบนจึงเหมือนกับ:

Count[GCD[Range[#], #], 1] &

11

MATL, 7 ไบต์

t:Zd1=s

คุณสามารถTryItOnline แนวคิดที่ง่ายที่สุดสร้างเวกเตอร์ 1 ถึง N และถ่าย gcd ของแต่ละองค์ประกอบด้วย N ( Zdทำ gcd) จากนั้นค้นหาองค์ประกอบใดเท่ากับ 1 และหาผลรวมของเวกเตอร์เพื่อรับคำตอบ


builtin _Zpสำหรับผู้ที่สงสัย
David

10

J, 9 ไบต์

(-~:)&.q:

สิ่งนี้ขึ้นอยู่กับการเขียนเรียงความของ Jsoftware เกี่ยวกับฟังก์ชั่นTotient

รับn = p 1 e 1p 2 e 2 ∙∙∙ p k e kโดยที่p kเป็นปัจจัยสำคัญของn , ฟังก์ชัน totient φ ( n ) = φ ( p 1 e 1 ) ∙φ ( p 2 e 2 ) ∙∙∙φ ( p k e k ) = ( p 1 - 1) p 1 e 1 - 1 ∙ ( p 2 - 1) p 2E 2 - 1 ∙∙∙ ( P k - 1) P k E k - 1

การใช้

   f =: (-~:)&.q:
   (,.f"0) 1 2 3 8 9 26 44 105
  1  1
  2  1
  3  2
  8  4
  9  6
 26 12
 44 20
105 48
   f 12345
6576

คำอธิบาย

(-~:)&.q:  Input: integer n
       q:  Prime decomposition. Get the prime factors whose product is n
(   )&     Operate on them
  ~:         Nub-sieve. Create a mask where 1 is the first occurrence
             of a unique value and 0 elsewhere
 -           Subtract elementwise between the prime factors and the mask
     &.q:  Perform the inverse of prime decomposition (Product of the values)

ใช้ความจริงที่ว่า totient เป็นคูณที่จะทำให้การแก้ปัญหาอีกใน J ใช้ recursion :)
รั่วนูน

@LeakyNun ฉันไม่คิดว่าจะมีวิธีง่าย ๆ ในการเล่นกอล์ฟแฟคตอริ่งเนื่องจากแม้แต่การใช้รูปแบบวนซ้ำ[:*/@({.(^-(^<:)){:)2&p:ต้องใช้ 24 ไบต์แม้แต่ใช้บิวอินเพื่อรับช่วงเวลาและเลขชี้กำลังของพวกเขา หรืออาจจะมีวิธีที่สั้นกว่าและฉันไม่เห็นมัน
ไมล์


7

Haskell, 28 ไบต์

f n=sum[1|1<-gcd n<$>[1..n]]

ใช้ของ Haskell จับคู่รูปแบบของค่าคงที่ เทคนิคที่นี่เป็นมาตรฐานสำหรับการเล่นกอล์ฟ แต่ฉันจะอธิบายให้ผู้ชมทั่วไปฟัง

การแสดงออกgcd n<$>[1..n]แผนที่บนgcd n [1..n]ในคำอื่น ๆ ก็คำนวณgcdกับnจำนวนจากกัน1ไปn:

[gcd n i|i<-[1..n]]

จากที่นี่ผลลัพธ์ที่ต้องการคือจำนวน1รายการ แต่ Haskell ขาดcountฟังก์ชั่น วิธีใช้สำนวนที่จะfilterรักษาเพียงอย่างเดียว1และใช้ผลลัพธ์lengthที่ได้ซึ่งมีความยาวเกินไปสำหรับการเล่นกอล์ฟ

แทนfilterจะถูกจำลองโดยความเข้าใจรายการกับรายการที่เกิดขึ้น[1|1<-l] lโดยปกติ comprehensions รายการผูกค่าบนตัวแปรเหมือนใน[x*x|x<-l]แต่ Haskell 1ช่วยให้รูปแบบที่จะจับคู่กับในกรณีนี้อย่างต่อเนื่อง

ดังนั้นการ[1|1<-l]สร้าง1ในแต่ละการแข่งขันได้1อย่างมีประสิทธิภาพการแยกเพียง1ของรายการเดิม การเรียกsumมันให้ความยาว


ฉันคิดว่านี่เป็นคำตอบแรกที่ฉันเข้าใจ มันเป็นภาษาที่เจ๋งมาก แต่มันแตกต่างจากภาษาอื่นมากที่สุด
bkul

ว้าวฉันคาดว่าการจับคู่รูปแบบจะต้องครบถ้วนในรายการความเข้าใจ ขอบคุณสำหรับเคล็ดลับ
Damien

7

Python 2, 44 ไบต์

f=lambda n,d=1:d/n or-f(d)*(n%d<1)-~f(n,d+1)

หักกอล์ฟ:

f=lambda n:n-sum(f(d)for d in range(1,n)if n%d<1)

ใช้สูตรที่ผลคูณของออยเลอร์ของตัวหารnมีผลรวมของn:

ป้อนคำอธิบายรูปภาพที่นี่

มูลค่าของϕ(n)สามารถคำนวณซ้ำเป็นnลบด้วยผลรวมมากกว่าตัวหารที่ไม่น่าสนใจ อย่างมีประสิทธิภาพสิ่งนี้กำลังทำMöbius inversionบนฟังก์ชันเอกลักษณ์ ผมใช้วิธีการเดียวกันในกอล์ฟการคำนวณฟังก์ชันMöbius

ขอขอบคุณที่เดนนิสสำหรับการบันทึก 1 ไบต์กับกรณีฐานที่ดีกว่าการแพร่กระจายค่าเริ่มต้นของ+nเข้า+1สำหรับแต่ละลูปทำตามn-~



5

J, 11 ไบต์

+/@(1=+.)i.

การใช้

>> f =: +/@(1=+.)i.
>> f 44
<< 20

>>STDIN อยู่ที่ไหนและ<<STDOUT

คำอธิบาย

+/ @ ( 1 = +. ) i.
               │
   ┌───────────┴┐
 +/@(1=+.)      i.
   │
 ┌─┼──┐
+/ @ 1=+.
    ┌─┼─┐
    1 = +.

>> (i.) 44            NB. generate range
<< 0 1 2 3 4 ... 43
>> (+.i.) 44          NB. calculate gcd of each with input
<< 44 1 2 1 4 ... 1
>> ((1=+.)i.) 44      NB. then test if each is one (1 if yes, 0 if no)
<< 0 1 0 1 0 ... 1
>> (+/@(1=+.)i.) 44   NB. sum of all the tests
<< 20

คุณได้รับการแสดงต้นไม้แนวตั้งได้อย่างไร ฉันคิดว่ามันผลิตในแนวนอนเท่านั้น
ไมล์

@ ไฟล์ฉันพิมพ์ด้วยตัวเอง
Leun Nun

5

Python> = 3.5, 76 64 58 ไบต์

ขอบคุณ LeakyNun สำหรับการเล่นกอล์ฟขนาด 12 (!) ไบต์

ขอบคุณ Sp3000 สำหรับการเล่นกอล์ฟขนาด 6 ไบต์

import math
lambda n:sum(math.gcd(n,x)<2for x in range(n))

ฉันชอบ Python ที่อ่านได้ แม้จะผ่านการตีกอล์ฟ


1
lambda n:sum(gcd(n,x)<2for x in range(n))
Leun Nun

ในที่สุด Python ก็ถูกเพิ่มgcdเข้าไปในโมดูลคณิตศาสตร์! ฉันไม่รู้
rubik

5

Regex (ECMAScript) 131 ไบต์

อย่างน้อย -12 ไบต์ต้องขอบคุณ Deadcode (ในการแชท)

(?=((xx+)(?=\2+$)|x+)+)(?=((x*?)(?=\1*$)(?=(\4xx+?)(\5*(?!(xx+)\7+$)\5)?$)(?=((x*)(?=\5\9*$)x)(\8*)$)x*(?=(?=\5$)\1|\5\10)x)+)\10|x

ลองออนไลน์!

ผลลัพธ์คือความยาวของการแข่งขัน

ECMAScript regexes ทำให้ยากมากที่จะนับสิ่งใด backref ใด ๆ ที่กำหนดไว้ภายนอก loop จะคงที่ในระหว่าง loop, backref ใด ๆ ที่กำหนดภายใน loop จะถูกรีเซ็ตเมื่อทำการลูป ดังนั้นวิธีเดียวที่จะทำให้สถานะข้ามการวนซ้ำนั้นใช้ตำแหน่งการจับคู่ปัจจุบัน นั่นคือจำนวนเต็มเดียวและมันสามารถลดลงได้ (ตำแหน่งก็จะเพิ่มขึ้น แต่ความยาวของหางจะลดลงและนั่นคือสิ่งที่เราสามารถทำคณิตศาสตร์ได้)

เมื่อพิจารณาจากข้อ จำกัด เหล่านั้นการนับจำนวน coprime ดูเหมือนเป็นไปไม่ได้ แต่เราใช้สูตรของออยเลอร์ในการคำนวณหาผลรวม

นี่คือลักษณะของปลอมใน pseudocode:

N = input
Z = largest prime factor of N
P = 0

do:
   P = smallest number > P that’s a prime factor of N
   N = N - (N / P)
while P != Z

return N

มีสองสิ่งที่น่าสงสัยเกี่ยวกับเรื่องนี้

อันดับแรกเราไม่บันทึกอินพุตเฉพาะผลิตภัณฑ์ปัจจุบันดังนั้นเราจะไปถึงปัจจัยสำคัญของอินพุตได้อย่างไร เคล็ดลับคือ (N - (N / P)) มีปัจจัยสำคัญเหมือนกัน> P เป็น N มันอาจได้รับปัจจัยใหม่ที่สำคัญ <P แต่เราไม่สนใจสิ่งเหล่านั้น โปรดทราบว่าสิ่งนี้ใช้งานได้เพียงเพราะเราวนซ้ำปัจจัยที่สำคัญที่สุดจากน้อยที่สุดไปหามากที่สุดไปทางอื่นจะล้มเหลว

ข้อที่สองเราต้องจำตัวเลขสองตัวในการวนซ้ำวนซ้ำ (P และ N, Z ไม่นับเพราะมันคงที่) และฉันแค่บอกว่ามันเป็นไปไม่ได้! โชคดีที่เราสามารถ Swizzle ทั้งสองตัวเลขในหนึ่งเดียว โปรดทราบว่าในตอนเริ่มต้นของลูป N จะเป็นผลคูณของ Z เสมอในขณะที่ P จะน้อยกว่า Z เสมอดังนั้นเราสามารถจำ N + P และแยก P ด้วยโมดูโลได้

นี่คือรหัสเทียมที่มีรายละเอียดเล็กน้อยมากขึ้น:

N = input
Z = largest prime factor of N

do:
   P = N % Z
   N = N - P
   P = smallest number > P that’s a prime factor of N
   N = N - (N / P) + P
while P != Z

return N - Z

และนี่คือ regex ที่แสดงความคิดเห็น:

# \1 = largest prime factor of N
# Computed by repeatedly dividing N by its smallest factor
(?= ( (xx+) (?=\2+$) | x+ )+ )

(?=
        # Main loop!
        (
                # \4 = N % \1, N -= \4
                (x*?) (?=\1*$)

                # \5 = next prime factor of N
                (?= (\4xx+?) (\5* (?!(xx+)\7+$) \5)? $ )

                # \8 = N / \5, \9 = \8 - 1, \10 = N - \8
                (?= ((x*) (?=\5\9*$) x) (\8*) $ )

                x*
                (?=
                        # if \5 = \1, break.
                        (?=\5$) \1
                |
                        # else, N = (\5 - 1) + (N - B)
                        \5\10
                )
                x
        )+
) \10

และเป็นโบนัส ...

Regex (ECMAScript 2018, จำนวนการแข่งขัน), 23 ไบต์

x(?<!^\1*(?=\1*$)(x+x))

ลองออนไลน์!

ผลลัพธ์คือจำนวนการแข่งขัน ECMAScript 2018 แนะนำการมองความยาวผันแปร (ประเมินจากขวาไปซ้าย) ซึ่งทำให้สามารถนับจำนวน coprime ทั้งหมดด้วยอินพุตได้อย่างง่ายดาย

ปรากฎว่าสิ่งนี้เป็นวิธีเดียวกับที่ใช้โดยโซลูชัน Retina ของ Leaky Nunและ regex นั้นก็มีความยาวเท่ากัน ( และสามารถเปลี่ยนได้ ) ฉันออกจากที่นี่เพราะอาจเป็นที่สนใจว่าวิธีนี้ใช้ได้ใน ECMAScript 2018 (ไม่ใช่แค่. NET)

                        # Implicitly iterate from the input to 0
x                       # Don’t match 0
 (?<!                 ) # Match iff there is no...
                 (x+x)  # integer >= 2...
         (?=\1*$)       # that divides the current number...
     ^\1*               # and also divides the input

4

Perl 6 ,  26 24  22 ไบต์

{[+] (^$^n Xgcd $n) X== 1}
{+grep 2>*,(^$_ Xgcd$_)}
{[+] 2 X>(^$_ Xgcd$_)}

คำอธิบาย:

{
  [+] # reduce using &infix:<+>
    2
    X[>] # crossed compared using &infix:«>»
    (
      ^$_    # up to the input ( excludes input )
      X[gcd] # crossed using &infix:<gcd>
      $_     # the input
    )
}

ตัวอย่าง:

#! /usr/bin/env perl6
use v6.c;

my  = {[+] 2 X>(^$_ Xgcd$_)};

say φ(1) # 1
say φ(2) # 1
say φ(3) # 2
say φ(8) # 4
say φ(9) # 6
say φ(26) # 12
say φ(44) # 20
say φ(105) # 48

say φ 12345 # 6576


4

Julia, 25 ไบต์

!n=sum(i->gcd(i,n)<2,1:n)

มันง่าย - The sumฟังก์ชั่นช่วยให้คุณสามารถที่จะให้มันฟังก์ชั่นที่จะใช้ก่อนที่จะสรุป - พื้นเทียบเท่าของการทำงานแล้วmap ตรงนี้นับจำนวนของตัวเลขความสำคัญน้อยกว่าsumn


4

Python 2, 57 ไบต์

f=lambda n,k=1,m=1:n*(k>n)or f(n-(n%k<m%k)*n/k,k+1,m*k*k)

ทดสอบบนIdeone

พื้นหลัง

ตามสูตรการผลิตออยเลอร์ ,

สูตรผลิตภัณฑ์ของออยเลอร์

ที่φหมายถึงฟังก์ชัน totient ของออยเลอร์และpแตกต่างกันไปตามจำนวนเฉพาะเท่านั้น

ในการระบุช่วงเวลาเราใช้ทฤษฎีบทของวิลสัน :

ข้อพิสูจน์ทฤษฎีบทของวิลสัน

มันทำงานอย่างไร

ทุกครั้งที่ตัวแปรเมตรจะเท่ากับตารางของปัจจัยของk - 1 ในความเป็นจริงเราตั้งชื่ออาร์กิวเมนต์เป็นk = 1และm = 0! 2 = 1

ตราบเท่าที่k≤nให้n*(k>n)ประเมินเป็น0และโค้ดต่อไปนี้orจะถูกเรียกใช้งาน

จำได้ว่าm%kจะให้1ถ้าmเป็นจำนวนเฉพาะและ0ถ้าไม่ใช่ ซึ่งหมายความว่าx%k<m%kจะให้ผลผลิตที่แท้จริงและถ้าหากทั้งkเป็นจำนวนเฉพาะและxคือหารด้วยk

ในกรณีนี้(n%k<m%k)*n/kให้ผลตอบแทนn / kและลบออกจากnแทนที่ค่าก่อนหน้าด้วยn (1 - 1 / k)เช่นเดียวกับในสูตรผลิตภัณฑ์ของออยเลอร์ มิฉะนั้น(n%k<m%k)*n/kอัตราผลตอบแทน0และnยังคงไม่เปลี่ยนแปลง

หลังจากคำนวณข้างต้นเราเพิ่มค่าkและคูณmด้วยค่า "เก่า" ของk 2ดังนั้นจึงรักษาความสัมพันธ์ที่ต้องการระหว่างkและmแล้วเรียกfซ้ำด้วยอาร์กิวเมนต์ที่อัปเดตซ้ำ

เมื่อkมีค่าเกินnให้n*(k>n)ประเมินค่าเป็นnซึ่งส่งคืนโดยฟังก์ชัน


4

Ruby, 32 ไบต์

->n{(1..n).count{|i|i.gcd(n)<2}}

แลมบ์ดาที่รับจำนวนเต็ม n และส่งกลับจำนวนของจำนวนเต็มในช่วง (1..n) คือ coprime ด้วย n


สวัสดีและยินดีต้อนรับสู่ PPCG! นี่คือโพสต์แรกที่ดี
NoOne อยู่ที่

ยินดีต้อนรับสู่การเขียนโปรแกรมปริศนาและรหัสกอล์ฟ! นี่เป็นทางออกแรกที่ดีมาก
bkul

ขอบคุณไม่ใช่สั้นที่จริง ๆ ฉันสงสัยว่าเป็นไปได้ที่จะปรับปรุง
Redouane Red

3

Brachylogขนาด 25 ไบต์

:{:1e.$pdL,?$pd:LcCdC}fl.

คำอธิบาย

Brachylog ยังไม่มี GCD ในตัวดังนั้นเราจึงตรวจสอบว่าตัวเลขทั้งสองนั้นไม่มีปัจจัยสำคัญร่วมกัน

  • ภาคแสดงหลัก:

    :{...}fl.             Find all variables which satisfy predicate 1 when given to it as
                          output and with Input as input.
                          Unify the Output with the length of the resulting list
    
  • คำกริยาที่ 1:

    :1e.                  Unify Output with a number between Input and 1
        $pdL              L is the list of prime factors of Output with no duplicates
            ,
             ?$pd:LcC     C is the concatenation of the list of prime factors of Input with
                          no duplicates and of L
                     dC   C with duplicates removed is still C
    


3

PowerShell v2 +, 72 ไบต์

param($n)1..$n|%{$a=$_;$b=$n;while($b){$a,$b=$b,($a%$b)};$o+=!($a-1)};$o

PowerShell ไม่มีฟังก์ชั่น GCD ให้ใช้งานดังนั้นฉันจึงต้องหมุนเอง

นี้จะใช้เวลาการป้อนข้อมูล$nแล้วช่วงจาก1ไปและท่อที่เป็นห่วง$n |%{...}แต่ละซ้ำเราตั้งสองตัวแปรผู้ช่วย$aและ$bแล้วดำเนินการ GCD whileห่วง แต่ละซ้ำเรากำลังตรวจสอบว่า$bยังคงไม่ใช่ศูนย์แล้วบันทึก$a%$bการ$bและค่าก่อนหน้านี้$bที่จะ$aห่วงถัดไป จากนั้นเราจะสะสมว่า$aเท่ากับ1ในตัวแปรเอาต์พุตของเรา$oหรือไม่ เมื่อทำการวนรอบเสร็จแล้วเราวาง$oบนไพพ์ไลน์และเอาท์พุทก็เป็นนัย

เป็นตัวอย่างของวิธีการwhileทำงานของลูปให้พิจารณา$n=20และเปิด$_=8ใช้งาน การตรวจสอบครั้งแรกมี$b=20ดังนั้นเราจึงเข้าสู่วง เราคำนวณครั้งแรก$a%$bหรือ8%20 = 8ที่ได้รับการตั้งค่าไป$bในเวลาเดียวกันกับที่ได้รับการตั้งค่า20 $aตรวจสอบ8=0และเราป้อนการวนซ้ำครั้งที่สอง จากนั้นเราจะคำนวณ20%8 = 4และชุดที่$bแล้วตั้งไป$a 8ตรวจสอบ4=0และเราเข้าสู่การทำซ้ำครั้งที่สาม เราคำนวณ8%4 = 0และชุดที่$bแล้วตั้งไป$a 4ตรวจสอบ0=0และเราออกจากวงเพื่อให้GCD (8,20)$a = 4คือ ดังนั้น!($a-1) = !(4-1) = !(3) = 0เพื่อให้$o += 0และเราจะไม่นับว่าเป็นหนึ่งใน


3

ตัวคูณ 50 ไบต์

[ dup iota swap '[ _ gcd nip 1 = ] filter length ]

ทำให้ช่วง ( iota ) nและcurries nเป็นฟังก์ชันที่รับgcd xnสำหรับค่าทั้งหมด0 <= x <= nให้ทดสอบว่าผลลัพธ์คือ1หรือไม่ กรองช่วงดั้งเดิมว่าผลลัพธ์ของgcd xnเป็น1และใช้ความยาวหรือไม่


[ dup iota swap '[ _ gcd nip 1 = ] map sum ]บันทึก 6 ไบต์ (ฉันคิดว่า - ไม่ค่อยมีประสบการณ์กับปัจจัย)
bkul

@bkul ขอบคุณสำหรับคำแนะนำ! : D น่าเสียดายที่ไม่มีความเข้ากันได้ระหว่างตัวเลขและt/f(สัญลักษณ์) ใน Factor ดังนั้นวิธีเดียวที่จะนำไปใช้ซึ่งจะมี[ dup iota swap '[ _ gcd nip 1 = 1 0 ? ] map sum ]ความยาวเท่ากันกับโซลูชันปัจจุบัน
แมว

อ๊ะแดง พิมพ์ดีดที่แข็งแกร่งอีกครั้ง
bkul

@bkul ดีฉันขอขอบคุณสำหรับการพิมพ์ที่แข็งแกร่งและTYPED:ในรหัสปัจจัยจริง : P
cat


2

เรติน่า, 36 29 ไบต์

7 ไบต์ขอบคุณ Martin Ender

.+
$*
(?!(11+)\1*$(?<=^\1+)).

ลองออนไลน์!

คำอธิบาย

มีสองขั้นตอน (คำสั่ง)

ขั้นตอนแรก

.+
$*

มันคือการทดแทน regex อย่างง่ายโดยแปลงอินพุตเป็นหลาย ๆ

ยกตัวอย่างเช่นจะถูกแปลงเป็น511111

ขั้นตอนที่สอง

(?!(11+)\1*$(?<=^\1+)).

regex นี้พยายามจับคู่ตำแหน่งที่ตรงตามเงื่อนไข (co-prime กับอินพุต) จากนั้นส่งคืนจำนวนการจับคู่


Lookbehind ไม่ย้อนกลับเว้นแต่ใน lookahead?
Leun Nun

Lookarounds ไม่ย้อนรอยโดยทั่วไป
Martin Ender

จากนั้น regex ทดสอบตัวหารทุกตัวอย่างไร
Leun Nun

1
พวกมันจะย้อนรอยตราบใดที่คุณไม่ทิ้งมันไว้ ตราบใดที่เครื่องยนต์อยู่ใน lookaround มันจะพยายามทุกอย่างที่เป็นไปได้เพื่อให้การจับคู่ lookaround นั้น (หรือล้มเหลวในกรณีของ lookaround เชิงลบ) แต่เมื่อผ่านการตรวจสอบแล้วเครื่องยนต์จะไม่ย้อนกลับไปหามันหากมีสิ่งใดเกิดขึ้นหลังจากที่มันล้มเหลว (เว้นแต่ว่ามันจะเริ่มย้อนกลับไปหาสิ่งที่อยู่ด้านหน้าของตัวตรวจจับและต้องประเมินทุกอย่างใหม่)
Martin Ender

2

เสียงกระเพื่อมสามัญ, 58 ไบต์

(defun o(x)(loop for i from 1 to x if (=(gcd x i)1)sum 1))

นี่คือลูปแบบง่ายซึ่งนับ 1 ถึง n ที่กำหนดและเพิ่มผลรวมหาก gcd = 1 ฉันใช้ชื่อฟังก์ชัน o เนื่องจาก t เป็นค่าบูลีนจริง ไม่เกือบสั้นที่สุด แต่ค่อนข้างง่าย


CL ไม่มีฟังก์ชันที่ไม่ระบุชื่อหรือไม่?
แมว


2

Python 2 , 44 ไบต์

lambda n:sum(k/n*k%n>n-2for k in range(n*n))

นี้จะใช้วิธีการเดียวกันเพื่อแจ้ง coprimes เป็นคำตอบของฉัน“Coprimes ถึง N”

ลองออนไลน์!


1
ด้วยผมเห็นการปรับเล็กน้อยของการตรวจสอบสำหรับผลิตภัณฑ์ของn-1แทนซึ่งจะทำให้มันทำงานให้1 n==1
Ørjan Johansen


1

ที่จริงแล้ว 11 ไบต์

;╗R`╜g`M1@c

ลองออนไลน์!

คำอธิบาย

;╗R`╜g`M1@c   register stack             remarks

                       44
;                      44 44
 ╗            44       44
  R           44       [1 2 3 .. 44]
       M      44       10                for example
    ╜         44       10 44
     g        44       2
              44       [1 2 1 .. 44]     gcd of each with register
        1     44       [1 2 1 .. 44] 1
         @    44       1 [1 2 1 .. 44]
          c   44       20                count

ในตัวด้วย

ลองออนไลน์!


หรือคุณสามารถใช้;╗R`╜g1=`MΣนับไบต์เดียวกันได้
Mego



1

APL, 7 ไบต์

+/1=⊢∨⍳

รถไฟขบวนนี้เป็นฟังก์ชัน monadic ที่ใช้จำนวนเต็มทางด้านขวา วิธีการที่นี่คือวิธีที่ชัดเจน: sum ( +/) จำนวนครั้งที่ GCD ของอินพุตและตัวเลขจาก 1 ถึงอินพุต ( ⊢∨⍳) เท่ากับ 1 ( 1=)

ลองที่นี่


1

Haskell, 31 30 ไบต์

\n->sum[1|x<-[1..n],gcd n x<2]

บันทึก 1 ไบต์ขอบคุณ @Damien

เลือกค่าที่มี gcd = 1 จับคู่แต่ละรายการกับ 1


คุณสามารถแทนที่ได้==1ด้วย<2
Damien

1

แบตช์, 151 145 144 ไบต์

@echo off
set t=
for /l %%i in (1,1,%1)do call:g %1 %%i
echo %t%
exit/b
:g
set/ag=%1%%%2
if not %g%==0 call:g %2 %g%
if %2%==1 set/at+=1

แก้ไข: บันทึก 4 ไบต์โดยลบช่องว่างที่ไม่จำเป็นออก ที่บันทึกไว้ 1 +=ไบต์โดยใช้ บันทึก 1 ไบต์โดยล้างข้อมูลtตามที่+=จะตีความเช่น0นั้น บันทึก 1 ไบต์ขอบคุณ @ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.