Carmichael lambda function: Difference between revisions

From Rosetta Code
Content added Content deleted
(Created page with "{{draft task}} {{task|Prime Numbers}} ;Background The '''Carmichael function''', or '''Carmichael lambda function''', is a function in numeric theory. The Carmichael lambda {{math | ''λ''(''n'')}} of a positive integer '''n''' is the smallest positive integer '''n''' such that :<math>a^m \equiv 1 \pmod{n}</math> holds for every integer coprime to '''n'''. The Carmichael lambda function can be iterated, that is, called repeatedly on its result. If this iteration is p...")
 
(Python example)
Line 28: Line 28:
:* [[wp:Carmichael_function|Wikipedia entry for Carmichael function]]
:* [[wp:Carmichael_function|Wikipedia entry for Carmichael function]]
:* &nbsp; [[oeis:A181776|OEIS lambda(lamda(n)) function sequence]]
:* &nbsp; [[oeis:A181776|OEIS lambda(lamda(n)) function sequence]]



=={{header|Python}}==
Python has the Carmichael function in the SymPy library, where is is called reduced_totient.
<syntaxhighlight lang="Python">from sympy import reduced_totient

def iterated_to_one(i):
""" return k for the k-fold iterated lambda function where k is the first time iteration reaches 1 """
k = 0
while i > 1:
i = reduced_totient(i)
k += 1
return k


if __name__ == "__main__":
UP_TO = 20
MAX_TO_TEST = 1_000_000_000
FIRSTS = [0] * (UP_TO + 1)
FIRSTS[0] = 1

print('Iterations to 1 n lambda(n)\n==================================')
print(' 0 1 1')
for i in range(2, MAX_TO_TEST):
n = iterated_to_one(i)
if 0 < n <= UP_TO and FIRSTS[n] == 0:
FIRSTS[n] = i
j = 0 if n < 1 else int(reduced_totient(i))
print(f"{n:>4}{i:>17}{j:>11}")
if n >= UP_TO:
break


</syntaxhighlight>{{out}}
<pre>
Iterations to 1 n lambda(n)
==================================
0 1 1
1 2 1
2 3 2
3 5 4
4 11 10
5 23 22
6 47 46
7 283 282
8 719 718
9 1439 1438
10 2879 2878
11 34549 34548
12 138197 138196
13 531441 354294
14 1594323 1062882
15 4782969 3188646
16 14348907 9565938
17 43046721 28697814
18 86093443 86093442
19 258280327 258280326
20 688747547 688747546
</pre>

Revision as of 04:27, 30 January 2024

Carmichael lambda function is a draft programming task. It is not yet considered ready to be promoted as a complete task, for reasons that should be found in its talk page.
Task
Carmichael lambda function
You are encouraged to solve this task according to the task description, using any language you may know.
Background

The Carmichael function, or Carmichael lambda function, is a function in numeric theory. The Carmichael lambda λ(n) of a positive integer n is the smallest positive integer n such that

holds for every integer coprime to n.

The Carmichael lambda function can be iterated, that is, called repeatedly on its result. If this iteration is performed k times, this is considered the k-iterated Carmichael lambda function. Thus, λ(λ(n)) would be the 2-iterated lambda function. With repeated, sufficiently large but finite k-iterations, the iterated Carmichael function will eventually compute as 1 for all positive integers n.

Task
  • Write a function to obtain the Carmichael lamda of a positive integer. If the function is supplied by a core library of the language, this also may be used.
  • Write a function to count the number of iterations k of the k-iterated lambda function needed to get to a value of 1. Show the value of λ(n) and the number of k-iterations for integers from 1 to 25.
  • Find the lowest integer for which the value of iterated k is i, for i from 1 to 15.


Stretch task (an extension of the third task above)
  • Find, additionally, for i from 16 to 25, the lowest integer n for which the number of iterations k of the Carmichael lambda function from n to get to 1 is i.


See also


Python

Python has the Carmichael function in the SymPy library, where is is called reduced_totient.

from sympy import reduced_totient

def iterated_to_one(i):
    """ return k for the k-fold iterated lambda function where k is the first time iteration reaches 1 """
    k = 0
    while i > 1:
        i = reduced_totient(i)
        k += 1
    return k


if __name__ == "__main__":
    UP_TO = 20
    MAX_TO_TEST = 1_000_000_000
    FIRSTS = [0] * (UP_TO + 1)
    FIRSTS[0] = 1

    print('Iterations to 1     n   lambda(n)\n==================================')
    print('   0                1          1')
    for i in range(2, MAX_TO_TEST):
        n = iterated_to_one(i)
        if 0 < n <= UP_TO and FIRSTS[n] == 0:
            FIRSTS[n] = i
            j = 0 if n < 1 else int(reduced_totient(i))
            print(f"{n:>4}{i:>17}{j:>11}")    
            if n >= UP_TO:
                break
Output:
Iterations to 1     n   lambda(n)
==================================
   0                1          1
   1                2          1
   2                3          2
   3                5          4
   4               11         10
   5               23         22
   6               47         46
   7              283        282
   8              719        718
   9             1439       1438
  10             2879       2878
  11            34549      34548
  12           138197     138196
  13           531441     354294
  14          1594323    1062882
  15          4782969    3188646
  16         14348907    9565938
  17         43046721   28697814
  18         86093443   86093442
  19        258280327  258280326
  20        688747547  688747546