Обчисліть Phi (не Pi)


73

Ні, я не маю на увазі ϕ = 1.618...і π = 3.14159.... Я маю на увазі функції .

  • φ (x) - кількість цілих чисел, менших або рівних, xщо відносно простих x.
  • π (x) - кількість простих чисел, менших або рівних x.
  • Скажімо, що "не pi" - це π̅ (x), і визначимо його кількістю композитів, меншим або рівним x.

Завдання

Давши суворо додатне ціле число x, обчисліть φ (π̅ (x)) . Оцінка балів у байтах.

Приклади

Кожен рядок складається з входу (від 1 до 100 включно) та відповідного виводу, розділеного пробілом.

1 0 
2 0 
3 0 
4 1 
5 1 
6 1 
7 1 
8 2 
9 2 
10 4 
11 4 
12 2 
13 2 
14 6 
15 4 
16 6 
17 6 
18 4 
19 4 
20 10 
21 4 
22 12 
23 12 
24 6 
25 8 
26 8 
27 16 
28 6 
29 6 
30 18 
31 18 
32 8 
33 12 
34 10 
35 22 
36 8 
37 8 
38 20 
39 12 
40 18 
41 18 
42 12 
43 12 
44 28 
45 8 
46 30 
47 30 
48 16 
49 20 
50 16 
51 24 
52 12 
53 12 
54 36 
55 18 
56 24 
57 16 
58 40 
59 40 
60 12 
61 12 
62 42 
63 20 
64 24 
65 22 
66 46 
67 46 
68 16 
69 42 
70 20 
71 20 
72 32 
73 32 
74 24 
75 52 
76 18 
77 40 
78 24 
79 24 
80 36 
81 28 
82 58 
83 58 
84 16 
85 60 
86 30 
87 36 
88 32 
89 32 
90 48 
91 20 
92 66 
93 32 
94 44 
95 24 
96 70 
97 70 
98 24 
99 72 
100 36

Використовуйте це посилання, щоб обчислити очікуваний вихід для будь-якого вводу. Крім того , список входів і виходів для x <= 1000передбачений тут на Pastebin . (Створено за допомогою цієї програми Minkolang .)


Табло лідерів

Ось фрагмент стека для створення як звичайного табло, так і огляду переможців за мовою.

Щоб переконатися, що ваша відповідь відображається, будь ласка, почніть свою відповідь із заголовка, використовуючи наступний шаблон Markdown:

## Language Name, N bytes

де Nрозмір вашого подання. Якщо ви покращите свій рахунок, ви можете зберегти старі бали у заголовку, прокресливши їх. Наприклад:

## Ruby, <s>104</s> <s>101</s> 96 bytes

Якщо ви хочете включити у свій заголовок декілька чисел (наприклад, тому що ваш результат становить суму двох файлів або ви хочете окремо перерахувати штрафні санкції для перекладача), переконайтесь, що фактичний бал є останнім номером у заголовку:

## Perl, 43 + 2 (-p flag) = 45 bytes

Ви також можете зробити ім'я мови посиланням, яке потім з’явиться у фрагменті таблиць лідерів:

## [><>](http://esolangs.org/wiki/Fish), 121 bytes


Чи є обмеження щодо розміру входу?
lirtosiast

4
Чи є це питання даниною користувачеві PhiNotPi ?
прим

24
@primo Чому ти це вважаєш?
Mego

2
@primo: Це було натхнене його ім'ям і, безумовно, каламбур на ньому, але не зовсім данина йому.
El'endia Starman

1
@ edc65: Так, мабуть, так , як я дізнався вчора.
El'endia Starman

Відповіді:


27

GS2 , 12 10 байт

V@'◄l.1&‼l

У вихідному коді використовується кодування CP437 . Спробуйте в Інтернеті!

Тестовий запуск

$ xxd -r -ps <<< 564027116c2e3126136c > phinotpi.gs2
$ wc -c phinotpi.gs2 
10 phinotpi.gs2
$ gs2 phinotpi.gs2 <<< 1000
552

Як це працює

V          Read an integer n from STDIN.
 @         Push a copy of n.
  '        Increment the copy of n.
   ◄l      Push 1 and call primes; push the list of all primes below n+1.
     .     Count the primes.
      1    Subtract the count from n.
       &   Decrement to account for 1 (neither prime nor composite).
        ‼l Push 3 and call primes; apply Euler's totient function.

25
Назва файлу довше програми.
Флоріс

43

Regex (.NET), 122 113 байт

^(?=((?=.*$(?<=^(\3+(.+.))(.*?(?>(.\4)?)))).)+(.*))((?=.*(?=\6$)(?<=(?!(.+.)\8*(?=\6$)(?<=^\8+))(.+?(?>\9?)))).)+

Якщо припустити, що вхід і вихід не є одинаковими, а вихід береться з основної відповідності регулярного вираження.

Розбивка регулярного вираження:

  • ^(?=((?=.*$(?<=^(\3+(.+.))(.*?(?>(.\4)?)))).)+(.*)) обчислює π̅ (x) і фіксує решту рядка в групі 6, що захоплює, для твердження у другій частині.

    • .*$встановлює вказівник на кінець рядка, щоб у нас було ціле число xв одному напрямку.
    • (?<=^(\3+(.+.))(.*?(?>(.\4)?))) збігається справа наліво і перевіряє складене число, перебираючи з x на 0.
      • (.*?(?>(.\4)?))"змінна", яка починається від 0 у першій ітерації та продовжується від числа попередньої ітерації та циклів до x. Оскільки найменше складене число дорівнює 4, (.\4)?ніколи не проходить збіг, якщо доступна група захоплення 4.
      • ^(\3+(.+.))перевіряє, що залишилося за "змінною" вище (тобто x - "variable"), чи це складене число.
  • ((?=.*(?=\6$)(?<=(?!(.+.)\8*(?=\6$)(?<=^\8+))(.+?(?>\9?)))).)+обчислює φ (π̅ (x)), обмежуючи операції зліва направо на (?=\6$).

    • .*(?=\6$)встановлює покажчик на положення π̅ (x). Позначимо y = π̅ (x).
    • (?<=(?!(.+.)\8*(?=\6$)(?<=^\8+))(.+?(?>\9?))) збігається справа наліво і перевіряє відносний простір, перебираючи з (у - 1) на 0
      • (.+?(?>\9?)) "змінна", яка починається з 1 у першій ітерації та продовжується від числа попередньої ітерації та циклів до y
      • (?!(.+.)\8*(?=\6$)(?<=^\8+))збігається зліва направо 1 і перевіряє, чи є "змінна" і y відносно простими.
        • (.+.)\8*(?=\6$) вибирає дільник "змінної", який більший за 1, і побічним ефектом є те, що у нас є ціле число y зліва.
        • (?<=^\8+) перевіряє, чи дільник "змінної" є також дільником y.

1.. В .NET, вперед задає напрямок до LTR замість того, щоб слідувати поточному напрямку; look-позад задає напрям RTL замість того, щоб повертати напрямок.

Тестуйте регекс на RegexStorm .

Версія 2 відміняє групи, що не захоплюють, і використовує атомні групи замість умовного синтаксису.


24
Сер, ти злий.
РК.

9
Я думаю, він має дотик до Zalgo.
курйозданні

11
А тепер у вас дві проблеми. (Серйозно не мав уявлення, що ти можеш робити подібні речі з Regex ...)
Darrel Hoffman

21

J, 15 14 байт

5 p:<:-_1 p:>:

Це мовчазне, монадійне дієслово. Спробуйте його в Інтернеті з J.js .

Як це працює

                Right argument: y
            >:  Increment y.
       _1 p:    Calculate the number of primes less than y+1.
    <:          Decrement y.
      -         Calculate the difference of the results to the left and right.
5 p:            Apply Euler's totient function to the difference.

14
я можу пояснити пояснення? : P
anOKsquirrel

23
я хаз додав пояснення
Денніс

5
Я збирався сказати, що я відмовився від цього, тому що в ньому багато посмішок, але текст сказав мені уникати таких :(
Додді

@Dennis: Ваша перша відповідь змусила мене дуже сміятися, дякую за це!
Мехрдад

19

Серйозно , 27 байт

,;R`p`MΣ(-D;n;;╟@RZ`ig1=`MΣ

Так, я побив CJam! Спробуйте в Інтернеті

Пояснення ( aвідноситься до вершини стека, bвідноситься до другого зверху):

,;       take input and duplicate it
R`p`MΣ   push sum([is_prime(i) for i in [1,...,a]]) (otherwise known as the pi function)
(-D      rotate stack right by 1, subtract top two elements, subtract 1, push
            (@ could be used instead of (, but I was hoping the unmatched paren would bother someone)
;n;;     dupe top, push a b times, dupe top twice (effectively getting a a+1 times)
╟        pop n, pop n elements and append to list, push
@        swap top two elements
RZ       push [1,...,a], zip a and b
`ig1=`   define a function:
  i        flatten list
  g1=      compute gcd(a,b), compare to 1 (totient function)
MΣ       perform the function a on each element of b, sum and push

Примітка: з моменту опублікування цієї відповіді я додав функції pi та phi до Серйозно. Ось неконкурентна відповідь із цими функціями:

,;▓1-@-▒

Пояснення (деякі команди зміщуються, щоб інші не перетиналися):

,    get input (hereafter referred to as x)
;    duplicate x
 ▓   calculate pi(x) (we'll call this p)
1-   calculate 1-p
@-   bring x back on top, calculate x-1-p (not pi(x))
  ▒  calculate phi(not pi(x))

1
У вас СЕРІЙНО ВІДГОТОВАНО @Dennis!
TanMath

Будь ласка, не кажіть мені, що ви знали це у верхній частині голови ..
DividedByZero

1
GJ побиття CJam =)
недолік

14

Джулія, 52 50 байт

x->count(i->gcd(i,p)<2,1:(p=x-endof(primes(x))-1))

Це створює неназвану функцію, яка приймає і ціле число, і повертає ціле число. Щоб зателефонувати, дайте ім’я, наприклад f=x->....

Безголівки:

function phinotpi(x::Integer)
    # The number of composites less than or equal to x is
    # x - the number of primes less than or equal to x -
    # 1, since 1 is not composite
    p = x - length(primes(x)) - 1

    # Return the number of integers i between 1 and p such
    # that gcd(i, p) = 1. This occurs when i is relatively
    # prime to p.
    count(i -> gcd(i, p) == 1, 1:p)
end

Використовуйте sumзамість, countщоб зберегти пару символів. Це трохи засмучує, хоча - інший спосіб підрахунку простих чисел, sum(isprime,1:x)точно такої ж довжини endof(primes(x)).
Глен О

1
@GlenO Дякуємо за пропозицію, але sumне вдається для порожніх колекцій, коли countповертається 0. Таким чином sum, не дасть бажаного результату для x<4.
Олексій А.

8

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

EulerPhi[#-PrimePi@#-1]&

2
З Звичайно Mathematica має все це побудовано в ...
плескати

@ConfusedMr_C Очевидно :) Однак це не було дискваліфіковано, з очевидних причин: математичне програмне забезпечення не може перемогти гольф-гольфи в простих комбінаторних завданнях :)
yo

@ConfusedMr_C PhiNotPi@#&: 11 байт: P
LegionMammal978

8

Піт, 14 байт

JlftPTSQ/iLJJ1

Демонстрація , верифікатор

Ми обчислюємо композити за допомогою простого фільтра, беремо його довжину і зберігаємо J. Потім ми беремо gcd Jз кожним числом до J, і підраховуємо, скільки результатів дорівнює 1.


7

Minkolang 0,11 , 12 байт (НЕ конкурентоспроможний)

Ця відповідь НЕ є конкурентоспроможною. Я реалізував pi та phi як вбудовані, перш ніж розміщувати питання, що дає мені несправедливу перевагу. Я публікую це лише для тих, хто цікавиться мовою.

nd9M-1-9$MN.

Спробуйте тут.

Пояснення

n      Read in integer from input
d      Duplicate
9M     Pops off the top of stack as x and pushes pi(x)
-      Subtracts the top two elements on the stack (x - pi(x))
1-     Subtracts 1 (x-1 - pi(x))
9$M    Pops off the top of stack as x and pushes phi(x) (phi(x-1 - pi(x)))
N.     Outputs as integer and stops.

2
Я не думаю, що публікація неправдивих відповідей не є гарною ідеєю ...
yeti

20
Поки у них є відмова, я не думаю, що в цьому нічого поганого. Це насправді досить звично для старих проблем.
Денніс

4
@yeti: Технічно це недійсно. Тут використовувані функції були реалізовані до опублікування виклику. Я просто дискваліфікую його, тому що я затягнув з публікацією виклику, поки не були впроваджені дві особливості (які, до речі, я використовував для створення списків прикладів).
El'endia Starman

1
Те саме. Я роблю це багато, коли 𝔼𝕊𝕄𝕚𝕟 постійно оновлюється.
Mama Fun Roll

6

CJam, 28 байт

ri){mf1>},,_,f{){_@\%}h)=}1b

Спробуйте цю загадку в інтерпретаторі CJam або перевірити всі тестові випадки одразу .

Як це працює

ri                            Read an integer N from STDIN.
  )                           Increment it. 
   {    },                    Filter; for each I in [0 ... N]:
    mf                          Push I's prime factorization.
      1>                        Discard the first prime.
                              If there are primes left, keep I.
          ,                   Count the kept integers. Result: C
           _,                 Push [0 ... C-1].
             f{          }    For each J in [0 ... C-1], push C and J; then:
               )                Increment J.
                {    }h         Do:
                 _                Push a copy of the topmost integer..
                  @               Rotate the integer below on top of it.
                   \%             Take that integer modulo the other integer.
                                If the residue is non-zero, repeat the loop.
                                This computes the GCD of C and J+1 using the
                                Euclidean algorithm.
                       )        Increment the 0 on the stack. This pushes 1.

                        =     Push 1 if the GCD is 1, 0 if not.
                          1b  Add all Booleans.

Я спробував «перевірити всі випадки» посилання і отримав це: 1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111. Це так?
El'endia Starman

Так, він перевіряє, що застосування коду до лівого стовпця (вводу) дорівнює правому стовпцю (вихід).
Денніс

5
я можу хаз пояснення на dis1?
anOKsquirrel

9
@anOKsquirrel i haz пояснив dis1 2
Dennis

5
@Dennis kthxbai
anOKsquirrel

5

Пітона, 137 139

n=input()
print n,len([b for b in range(len([a for a in range(n)if not all(a%i for i in xrange(2,a))]))if all(b%i for i in xrange(2,b))])

2
Я думаю, що ви можете зберегти 2 байти, видаливши пробіли між range(n) ifта])) if
DankMemes

3
Враховуючи порівняно низьку здатність Python до гольфу (через вимоги до місця пробілів тощо), це дуже вражає!
felixphew

@DankMemes, дякую за пораду!
wnnmaw

5

Сітківка , 48 байт

.+
$*
M&`(..+)\1+$
.+
$*
(?!(..+)\1*$(?<=^\1+)).

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

Пояснення

.+
$*

Перетворити вхід в одинаковий.

M&`(..+)\1+$

Порахуйте складені числа, не більші за вхідні, підрахувавши, як часто ми можемо зіставити рядок, що складається з щонайменше двох повторень коефіцієнта принаймні 2.

.+
$*

Перетворити в одинарний знову.

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

Обчисліть φ, порахувавши, з якої кількості позицій неможливо знайти фактор (принаймні 2) суфікса з цієї позиції, який також є фактором префікса (якщо ми дійсно знайдемо такий фактор, то цей i <= nподіляє фактор на nотже, це не копрім). В .кінці гарантується, що ми не рахуємо нуль (для якого ми не можемо знайти коефіцієнт принаймні 2).


5

Regex (.NET), 88 86 байт

^(?=((?=(..+)\2+$)?.)+)(?=(?<-2>.)*(.+))(?=(((?!(..+)\6*(?<=^\6+)\3$))?.)*\3)(?<-5>.)*

Спробуйте в Інтернеті! (Як програма Retina.)

Використовується той самий ввід / вивід, що і відповідь n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳ , тобто одинарне введення, і воно відповідає підрядковій довжині результату.

Можливо, це ще більше скоротити, замінивши одну або обидві групи балансування на прямі посилання.

Альтернатива при тому ж кількості байтів:

^(?=((?=(..+)\2+$)?.)+)(?=(?<-2>.)*(.+))(?=(?((..+)\4*(?<=^\4+)\3$).|(.))*\3)(?<-5>.)*

Також є кілька альтернативних варіантів для першого півріччя, наприклад, використання негативного пошуку замість додатного для складових чисел або використання також умовного.

Пояснення

Я припускаю, що ви маєте основне розуміння балансуючих груп , але коротше кажучи, групи захоплення в .NET - це стеки (тому щоразу, коли ви повторно використовуєте групу захоплення, новий захоплення висувається зверху) і (?<-x>...)вискакує захоплення зі стека x. Це дуже корисно для підрахунку речей.

^                   # Only look at matches from the beginning of the input.
(?=                 # First, we'll compute the number of composites less than
                    # or equal to the input in group 2. This is done in a
                    # lookahead so that we don't actually advance the regex
                    # engine's position in the string.
  (                 #   Iterate through the input, one character at a time.
    (?=(..+)\2+$)?  #     Try to match the remainder of the input as a
                    #     composite number. If so the (..+) will add one
                    #     one capture onto stack 2. Otherwise, this lookahead
                    #     is simply skipped.
    .
  )+
)
(?=                 # It turns out to be more convienient to work with n minus
                    # the number of composites less than or equal to n, and to
                    # have that a single backreference instead of the depth of
                    # a stack.
  (?<-2>.)*         #   Match one character for each composite we found.
  (.+)              #   Capture the remainder of the input in group 3.
)
(?=                 # Now we compute the totient function. The basic idea is
                    # similar to how we computed the number of composites,
                    # but there are a few differences.
                    # a) Of course the regex is different. However, this one
                    #    is more easily expressed as a negative lookahead (i.e.
                    #    check that the values don't share a factor), so this
                    #    won't leave a capture on the corresponding stack. We
                    #    fix this by wrapping the lookahead itself in a group
                    #    and making the entire group optional.
                    # b) We only want to search up the number of composites,
                    #    not up to the input. We do this by asserting that we
                    #    can still match our backreference \3 from earlier.

  (                 #   Iterate through the input, one character at a time.
    ((?!            #     Try not to match a number that shares a factor with
                    #     the number of composites, and if so push a capture
                    #     onto stack 5.
      (..+)\6*      #     Look for a factor that's at least 2...
      (?<=^\6+)     #     Make sure we can reach back to the input with that
                    #     factor...
      \3$           #     ...and that we're exactly at the end of the number
                    #     of composites.
    ))?
    .
  )*
  \3                #   Match group 3 again to make sure that we didn't look
                    #   further than the number of composites.
)
(?<-5>.)*           # Finally, match one character for each coprime number we
                    # found in the last lookahead.


4

Желе , не конкуруючий

7 байт Ця відповідь є неконкурентоспроможною, оскільки вона використовує мову, яка подає виклик.

ÆC_@’ÆṪ

Як це працює

ÆC_@’ÆṪ  Input: n

ÆC       Count the primes less than or equal to n.
    ’    Yield n - 1.
  _@     Subtract the count from n - 1.
     ÆṪ  Apply Euler's totient function.

3

Октава, 52 51

@(b)nnz((d=[1:(c=b-1-nnz(primes(b)))])(gcd(d,c)<2))

Редагувати: збережено 1 байт завдяки Томасу Ква

Пояснення:

@(b)                                            # Define anonymous func with parameter b
  nnz(                                          # Count elements in φ(c)
    (                                           #
      d = [1:                                   # Create d= array of 1 to π̅(b)
            ( c = b - 1 - nnz(primes(b)) )      # Calculate c=π̅(b) by subtracting the
                                                #  number of elements in the array of prime
          ]                                     #  numbers from the number of ints in 2:b
    )(gcd(d, c) < 2)                            # Calculate φ(c) by using gcd to filter
  )                                             # relative primes from d


3

SageMath 26 байт

euler_phi(n-1-prime_pi(n))

Добре працює навіть n=0і n=1, завдяки реалізації Мудреца.





2

MATL , 9 байт (неконкурентоспроможний)

Ця відповідь є неконкурентоспроможною, оскільки мова висуває виклик.

:Zp~sq_Zp

Використовує версію (10.1.0) мови / компілятора.

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

Пояснення

:       % implicitly input a number "N" and produce array [1,2,...,N]
Zp      % true for entries that are prime
~       % negate. So it gives true for entries of [1,2,...,N] that are non-prime
s       % sum elements of array. So it gives number of non-primes
q       % subtract 1. Needed because number 1 is not prime, but not composite either
_       % unary minus
Zp      % with negative input, computes totient function of absolute value of input
        % implicit display

2

GAP, 33 байт

n->Phi(n-Number([-2..n],IsPrime))

Number(l,p)підраховує кількість елементів із lзадоволення p. Щоб компенсувати той факт, що 1 не є простим і не складеним, я повинен відняти від n один більше числа простих чисел до n. Замість того, щоб робити -1два байти, я починаю список на -2 замість 1 або 2, додаючи таким чином ще одне число, яке вважається простим лише IsPrimeдля одного додаткового байта.


2

Python 3,5 - 130 байт

from math import*
def p(n,k,g):
 for i in range(1,n+1):k+=factorial(i-1)%i!=i-1
 for l in range(1,k):g+=gcd(k,l)<2      
 return g

Якщо функцію передавати через p (n, 0,0) неприйнятно, то +3 байти.

Це скористається тим, що я використовую теорему Вілсона, щоб перевірити, чи є число складеним, і я повинен викликати математичний модуль для функціональної функції. Python 3.5 додав функцію gcd в математичний модуль.

Перший цикл коду збільшиться k на одиницю, якщо число складене, а приріст на 0 інший. (Хоча теорема Вілсона справедлива лише для цілих чисел, більших за 1, вона розглядає 1 як просте, тому дозволяє нам це використовувати).

Потім другий контур буде циклічним за діапазон кількості композитів та приріст g лише тоді, коли значення не pi та l є співпростими.

g - тоді число значень менше або дорівнює кількості складених чисел, менших або рівних n.



1

05AB1E , 11 8 байт

LDpÈÏg<Õ

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

Це може бути неконкурентним - я не можу дізнатися, коли було зроблено 05AB1E.

Як це працює

L             # this gets us the list of numbers [1 .. a]
 D            # duplicates this list
  p           # applies isPrime to each element of the list, vectorised.
   È          # is the element even? (does 05AB1E not have a logical not?)
    Ï         # push elements of the first list where the same index in the 
              # second list is 1
     g<       # finds the length and subtracts 1 (as the list contains 1)
              # this is the not pi function
       Õ      # euler totient function

1

Pyt , 6 байт

řṗ¬Ʃ⁻Ț

Пояснення:

                Implicit input
ř               Push [1,2,...,input]
 ṗ              [is 1 prime?, is 2 prime?, ..., is input prime?]
  ¬             [is 1 not prime?, is 2 not prime?, ... is input not prime?]
   Ʃ            Number of non-primes (sums the array - booleans implicitly converted to ints)
    ⁻           Subtract one to remove the counting of '1'
     Ț          Euler's totient function


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


1

APL NARS, 38 байт, 19 символів

{⍵≤3:0⋄13π¯1+⍵-2π⍵}

13π - сумарна функція, а 2π - функція підрахунку <= її аргумент. Тест

  b←{⍵≤3:0⋄13π¯1+⍵-2π⍵}     
  (⍳12),¨b¨⍳12
1 0  2 0  3 0  4 1  5 1  6 1  7 1  8 2  9 2  10 4  11 4  12 2 
  (95..100),¨b¨(95..100)
95 24  96 70  97 70  98 24  99 72  100 36

1

Додайте ++ , 21 байт

L,RþPbL1_dRdVÞ%bLG!!+

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

Як це працює

π¯(n)φ(n)π¯(n)φ(n)

π¯(n)

RþPbL1_

RþPþPbL1_x=π¯(n)

φ(n)

dRdVÞ%bLG!!+

xdRÞ%xxbL

n1nG!!

Так, я дуже хотів спробувати новий LaTex

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