Cycle detection: Difference between revisions

m
→‎{{header|Wren}}: Changed to Wren S/H
(→‎{{header|BQN}}: Combine ⍟≠⟜F instances and avoid an unnecessary iteration if x0=F x0)
m (→‎{{header|Wren}}: Changed to Wren S/H)
 
(5 intermediate revisions by 4 users not shown)
Line 1:
{{draftDraft task}}
 
;Task:
Line 33:
=={{header|11l}}==
{{trans|D}}
<langsyntaxhighlight lang="11l">F print_result(x0, f, len, start)
print(‘Cycle length = ’len)
print(‘Start index = ’start)
Line 72:
print_result(x0, f, cycle_length, cycle_start)
 
brent(i -> (i * i + 1) % 255, 3)</langsyntaxhighlight>
{{out}}
<pre>
Line 81:
 
=={{header|8086 Assembly}}==
<langsyntaxhighlight lang="asm"> cpu 8086
org 100h
section .text
Line 187:
ix: db 'Index: $'
len: db 'Length: $'
nl: db 13,10,'$'</langsyntaxhighlight>
{{out}}
<pre>3 10 101 2 5 26 167 95 101 2 5 26 167 95 101 2 5 26 167 95
Line 194:
=={{header|Ada}}==
This implementation is split across three files. The first is the specification of a generic package:
<langsyntaxhighlight lang="ada">
generic
type Element_Type is private;
Line 201:
procedure Brent(F : Brent_Function; X0 : Element_Type; Lambda : out Integer; Mu : out Integer);
end Brent;
</syntaxhighlight>
</lang>
The second is the body of the generic package:
<langsyntaxhighlight lang="ada">
package body Brent is
procedure Brent (F : Brent_Function; X0 : Element_Type; Lambda : out Integer; Mu : out Integer) is
Line 233:
end Brent;
end Brent;
</syntaxhighlight>
</lang>
By using a generic package, this implementation can be made to work for any unary function, not just integers. As a demonstration two instances of the test function are created and two instances of the generic package. These are produced inside the main procedure:
<langsyntaxhighlight lang="ada">
with Brent;
with Text_Io;
Line 277:
end loop;
end Main;
</syntaxhighlight>
</lang>
{{out}}
<pre> 3, 10, 101, 2, 5, 26, 167, 95, 101, 2, 5, 26, 167, 95, 101, 2, 5, 26, 167, 95, 101, 2, 5, 26, 167, 95, 101, 2, 5, 26, 167, 95, 101, 2, 5, 26, 167, 95, 101, 2, 5
Line 288:
=={{header|APL}}==
{{works with|Dyalog APL}}
<langsyntaxhighlight lang="apl">brent←{
f←⍺⍺
lam←⊃{
Line 307:
}
 
(255 | 1 + ⊢×⊢) task 3</langsyntaxhighlight>
{{out}}
<pre>3 10 101 2 5 26 167 95 101 2 5 26 167 95 101 2 5 26 167 95
Line 315:
 
=={{header|BCPL}}==
<langsyntaxhighlight BCPLlang="bcpl">get "libhdr"
 
// Brent's algorithm. 'fn' is a function pointer,
Line 370:
// print the cycle
printRange(f, 3, mu, mu+lam)
$)</langsyntaxhighlight>
{{out}}
<pre>3 10 101 2 5 26 167 95 101 2 5 26 167 95 101 2 5 26 167 95
Line 378:
 
=={{header|BQN}}==
<langsyntaxhighlight BQNlang="bqn">_Brent← {F _𝕣 x0:
p←l←1
(I ← {p=l?
Line 387:
{m+↩1 ⋄ 𝕨𝕊⍟≠○F𝕩}⟜(F⍟l) x0
l‿m‿(F⍟(m+↕l)x0)
}</langsyntaxhighlight>
{{out|Example use}}
<pre> (255|1+ט)_Brent 3
Line 394:
=={{header|C}}==
{{trans|Modula-2}}
<langsyntaxhighlight lang="c">#include <stdio.h>
#include <stdlib.h>
 
Line 472:
 
return 0;
}</langsyntaxhighlight>
{{out}}
<pre>[3, 10, 101, 2, 5, 26, 167, 95, 101, 2, 5, 26, 167, 95, 101, 2, 5, 26, 167, 95, 101, 2, 5, 26, 167, 95, 101, 2, 5, 26, 167, 95, 101, 2, 5, 26, 167, 95, 101, 2, 5]
Line 479:
Cycle = [101, 2, 5, 26, 167, 95]</pre>
 
=={{header|C_sharp|C#|C_sharp}}==
This solution uses generics, so may find cycles of any type of data, not just integers.
 
<langsyntaxhighlight lang="csharp">
 
// First file: Cycles.cs
Line 578:
}
 
</syntaxhighlight>
</lang>
 
=={{header|C++}}==
<langsyntaxhighlight lang="cpp">struct ListNode {
int val;
ListNode *next;
Line 617:
}
}
}</langsyntaxhighlight>
 
=={{header|CLU}}==
<syntaxhighlight lang="clu">% Find a cycle in f starting at x0 using Brent's algorithm
brent = proc [T: type] (f: proctype (T) returns (T), x0: T)
returns (int,int)
where T has equal: proctype (T,T) returns (bool)
pow: int := 1
lam: int := 1
tort: T := x0
hare: T := f(x0)
while tort ~= hare do
if pow = lam then
tort := hare
pow := pow * 2
lam := 0
end
hare := f(hare)
lam := lam + 1
end
tort := x0
hare := x0
for i: int in int$from_to(1,lam) do
hare := f(hare)
end
mu: int := 0
while tort ~= hare do
tort := f(tort)
hare := f(hare)
mu := mu + 1
end
return(lam, mu)
end brent
 
 
% Iterate over a function starting at x0 for N steps,
% starting at a given index
iterfunc = iter [T: type] (f: proctype (T) returns (T), x0: T, n, start: int)
yields (T)
for i: int in int$from_to(1, start) do
x0 := f(x0)
end
for i: int in int$from_to(1, n) do
yield(x0)
x0 := f(x0)
end
end iterfunc
 
% Iterated function
step_fn = proc (x: int) returns (int)
return((x*x + 1) // 255)
end step_fn
 
start_up = proc ()
po: stream := stream$primary_output()
% Print the first 20 items of the sequence
for i: int in iterfunc[int](step_fn, 3, 20, 0) do
stream$puts(po, int$unparse(i) || " ")
end
stream$putl(po, "")
% Find a cycle
lam, mu: int := brent[int](step_fn, 3)
% Print the length and index
stream$putl(po, "Cycle length: " || int$unparse(lam))
stream$putl(po, "Start index: " || int$unparse(mu))
% Print the cycle
stream$puts(po, "Cycle: ")
for i: int in iterfunc[int](step_fn, 3, lam, mu) do
stream$puts(po, int$unparse(i) || " ")
end
end start_up</syntaxhighlight>
{{out}}
<pre>3 10 101 2 5 26 167 95 101 2 5 26 167 95 101 2 5 26 167 95
Cycle length: 6
Start index: 2
Cycle: 101 2 5 26 167 95</pre>
 
=={{header|Cowgol}}==
<langsyntaxhighlight lang="cowgol">include "cowgol.coh";
 
typedef N is uint8;
Line 678 ⟶ 761:
print("Cycle length: "); print_i32(length as uint32); print_nl();
print("Cycle start: "); print_i32(start as uint32); print_nl();
PrintRange(x2_plus1_mod255, 3, start, length+start);</langsyntaxhighlight>
{{out}}
<pre>3 10 101 2 5 26 167 95 101 2 5 26 167 95 101 2 5 26 167 95
Line 687 ⟶ 770:
=={{header|D}}==
{{trans|Java}}
<langsyntaxhighlight Dlang="d">import std.range;
import std.stdio;
 
Line 729 ⟶ 812:
auto iterate(int start, int function(int) f) {
return only(start).chain(generate!(() => start=f(start)));
}</langsyntaxhighlight>
{{out}}
<pre>Cycle length: 6
Line 736 ⟶ 819:
=={{header|Elixir}}==
{{trans|Ruby}}
<langsyntaxhighlight lang="elixir">defmodule Cycle_detection do
def find_cycle(x0, f) do
lambda = find_lambda(f, x0, f.(x0), 1, 1)
Line 766 ⟶ 849:
# Test the find_cycle function
{clength, cstart} = Cycle_detection.find_cycle(3, f)
IO.puts "Cycle length = #{clength}\nStart index = #{cstart}"</langsyntaxhighlight>
 
{{out}}
Line 777 ⟶ 860:
=={{header|Factor}}==
This is a strict translation of the Python code from the Wikipedia article. Perhaps a more idiomatic version could be added in the future, although there is value in showing how Factor's lexical variables differ from most languages. A variable binding with <code>!</code> at the end is mutable, and subsequent uses of that name followed by <code>!</code> change the value of the variable to the value at the top of the data stack.
<langsyntaxhighlight lang="factor">USING: formatting kernel locals make math prettyprint ;
 
: cyclical-function ( n -- m ) dup * 1 + 255 mod ;
Line 807 ⟶ 890:
3 [ 20 [ dup , cyclical-function ] times ] { } make nip .
3 [ cyclical-function ] brent
"Cycle length: %d\nCycle start: %d\n" printf</langsyntaxhighlight>
{{out}}
<pre>
Line 816 ⟶ 899:
 
=={{header|FOCAL}}==
<langsyntaxhighlight lang="focal">01.10 S X0=3;T %3
01.20 S X=X0;F I=1,20;T X;D 2
01.30 D 3;T !" START",M,!,"LENGTH",L,!
Line 838 ⟶ 921:
03.80 I (T-H)3.9,3.99,3.9
03.90 S X=T;D 2;S T=X;S X=H;D 2;S H=X;S M=M+1;G 3.8
03.99 R</langsyntaxhighlight>
{{out}}
<pre>= 3= 10= 101= 2= 5= 26= 167= 95= 101= 2= 5= 26= 167= 95= 101= 2= 5= 26= 167= 95
Line 847 ⟶ 930:
=={{header|Forth}}==
Works with gforth.
<syntaxhighlight lang="forth">
<lang Forth>
: cycle-length { x0 'f -- lambda } \ Brent's algorithm stage 1
1 1 x0 dup 'f execute
Line 884 ⟶ 967:
." The cycle is " 3 ' f(x) .cycle cr
bye
</syntaxhighlight>
</lang>
{{Out}}
<pre>
Line 894 ⟶ 977:
===Brent's algorithm===
{{trans|Python}}
<langsyntaxhighlight lang="freebasic">' version 11-01-2017
' compile with: fbc -s console
 
Line 965 ⟶ 1,048:
Print : Print "hit any key to end program"
Sleep
End</langsyntaxhighlight>
{{out}}
<pre> Brent's algorithm
Line 974 ⟶ 1,057:
===Tortoise and hare. Floyd's algorithm===
{{trans|Wikipedia}}
<langsyntaxhighlight lang="freebasic">' version 11-01-2017
' compile with: fbc -s console
 
Line 1,054 ⟶ 1,137:
Print : Print "hit any key to end program"
Sleep
End</langsyntaxhighlight>
 
=={{header|Go}}==
Line 1,061 ⟶ 1,144:
 
Run it on the [https://play.golang.org/p/unOtxuwZfg go playground], or on [https://goplay.space/#S1pQZSuJci go play space].
<syntaxhighlight lang="go">
<lang Go>
package main
 
Line 1,119 ⟶ 1,202:
}
fmt.Println("Cycle:", a[µ:µ+λ])
}</langsyntaxhighlight>
 
{{out}}
Line 1,128 ⟶ 1,211:
=={{header|Groovy}}==
{{trans|Java}}
<langsyntaxhighlight lang="groovy">import java.util.function.IntUnaryOperator
 
class CycleDetection {
Line 1,176 ⟶ 1,259:
println()
}
}</langsyntaxhighlight>
{{out}}
<pre>Cycle length: 6
Line 1,187 ⟶ 1,270:
Haskellers, being able to handle conceptually infinite structures, traditionally consider totality as an important issue. The following solution is total for total inputs (modulo totality of iterated function) and allows nontermination only if input is explicitly infinite.
 
<langsyntaxhighlight lang="haskell">import Data.List (findIndex)
 
findCycle :: Eq a => [a] -> Maybe ([a], Int, Int)
Line 1,204 ⟶ 1,287:
| pow == lam = loop (2*pow) 1 y ys
| otherwise = loop pow (1+lam) x ys
in loop 1 1 x xs</langsyntaxhighlight>
 
'''Examples'''
Line 1,233 ⟶ 1,316:
Brute force implementation:
 
<langsyntaxhighlight Jlang="j">cdetect=:1 :0
r=. ~.@(,u@{:)^:_ y
n=. u{:r
(,(#r)-])r i. n
)</langsyntaxhighlight>
 
In other words: iterate until we stop getting new values, find the repeated value, and see how it fits into the sequence.
Line 1,243 ⟶ 1,326:
Example use:
 
<langsyntaxhighlight Jlang="j"> 255&|@(1 0 1&p.) cdetect 3
2 6</langsyntaxhighlight>
 
(Note that 1 0 1 are the coefficients of the polynomial <code>1 + (0 * x) + (1 * x * x)</code> or, if you prefer <code>(1 * x ^ 0) + (0 * x ^ 1) + (1 * x ^ 2)</code> - it's easier and probably more efficient to just hand the coefficients to p. than it is to write out some other expression which produces the same result.)
Line 1,250 ⟶ 1,333:
=={{header|Java}}==
{{works with|Java|8}}
<langsyntaxhighlight lang="java">import java.util.function.*;
import static java.util.stream.IntStream.*;
 
Line 1,292 ⟶ 1,375:
.forEach(n -> System.out.printf("%s ", n));
}
}</langsyntaxhighlight>
 
<pre>Cycle length: 6
Line 1,301 ⟶ 1,384:
{{works with|jq}}
'''Works with gojq, the Go implementation of jq'''
<langsyntaxhighlight lang="jq">def floyd(f; x0):
{tort: (x0|f)}
| .hare = (.tort|f)
Line 1,328 ⟶ 1,411:
"Cycle:",
skip(.mu; limit((.lambda + .mu); 3 | recurse(f)));
</syntaxhighlight>
</lang>
'''The specific function and task'''
<syntaxhighlight lang="jq">
<lang jq>
def f: (.*. + 1) % 255;
 
task(f;3)
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 1,357 ⟶ 1,440:
Following the Wikipedia article:
 
<langsyntaxhighlight lang="julia">using IterTools
 
function floyd(f, x0)
Line 1,392 ⟶ 1,475:
x -> Iterators.take(x, λ) |>
collect
println("Cycle length: ", λ, "\nCycle start index: ", μ, "\nCycle: ", join(cycle, ", "))</langsyntaxhighlight>
 
{{out}}
Line 1,400 ⟶ 1,483:
 
=={{header|Kotlin}}==
<langsyntaxhighlight lang="scala">// version 1.1.2
 
typealias IntToInt = (Int) -> Int
Line 1,448 ⟶ 1,531:
println("Start index = $mu")
println("Cycle = $cycle")
}</langsyntaxhighlight>
 
{{out}}
Line 1,460 ⟶ 1,543:
=={{header|Lua}}==
Fairly direct translation of the Wikipedia code, except that the sequence is stored in a table and passed back as a third return value.
<langsyntaxhighlight Lualang="lua">function brent (f, x0)
local tortoise, hare, mu = x0, f(x0), 0
local cycleTab, power, lam = {tortoise, hare}, 1, 1
Line 1,488 ⟶ 1,571:
print("Sequence:", table.concat(sequence, " "))
print("Cycle length:", cycleLength)
print("Start Index:", startIndex)</langsyntaxhighlight>
{{out}}
<pre>Sequence: 3 10 101 2 5 26 167 95 101 2 5 26 167 95
Line 1,495 ⟶ 1,578:
 
=={{header|Mathematica}}/{{header|Wolfram Language}}==
<langsyntaxhighlight Mathematicalang="mathematica">s = {3, 10, 101, 2, 5, 26, 167, 95, 101, 2, 5, 26, 167, 95, 101, 2, 5,
26, 167, 95, 101, 2, 5, 26, 167, 95, 101, 2, 5, 26, 167, 95, 101,
2, 5, 26, 167, 95, 101, 2, 5};
{transient, repeat} = FindTransientRepeat[s, 2];
Print["Starting index: ", Length[transient] + 1]
Print["Cycles: ", Floor[(Length[s] - Length[transient])/Length[repeat]]]</langsyntaxhighlight>
{{out}}
<pre>Starting index: 3
Line 1,507 ⟶ 1,590:
=={{header|Modula-2}}==
{{trans|Kotlin}}
<langsyntaxhighlight lang="modula2">MODULE CycleDetection;
FROM FormatString IMPORT FormatString;
FROM Terminal IMPORT WriteString,WriteLn,ReadChar;
Line 1,602 ⟶ 1,685:
 
ReadChar
END CycleDetection.</langsyntaxhighlight>
 
=={{header|Nim}}==
Translation of Wikipedia Python program.
<langsyntaxhighlight Nimlang="nim">import strutils, sugar
 
 
Line 1,656 ⟶ 1,739:
if i >= μ: cycle.add x
x = f(x)
echo "Cycle: ", cycle.join(" ")</langsyntaxhighlight>
 
{{out}}
Line 1,664 ⟶ 1,747:
 
=={{header|ooRexx}}==
<langsyntaxhighlight ooRexxlang="oorexx">/* REXX */
x=3
list=x
Line 1,681 ⟶ 1,764:
End
Exit
f: Return (arg(1)**2+1)//255 </langsyntaxhighlight>
{{out}}
<pre>
Line 1,692 ⟶ 1,775:
=={{header|Perl}}==
{{trans|Raku}}
<langsyntaxhighlight lang="perl">use utf8;
 
sub cyclical_function { ($_[0] * $_[0] + 1) % 255 }
Line 1,740 ⟶ 1,823:
print "Cycle length $l\n";
print "Cycle start index $s\n";
print show_range($s,$s+$l-1) . "\n";</langsyntaxhighlight>
{{out}}
<pre>3 10 101 2 5 26 167 95 101 2 5 26 167 95 101 2 5 26 167 95
Line 1,749 ⟶ 1,832:
=={{header|Phix}}==
Translation of the Wikipedia code, but using the more descriptive len and pos, instead of lambda and mu, and adding a limit.
<!--<langsyntaxhighlight Phixlang="phix">(phixonline)-->
<span style="color: #008080;">function</span> <span style="color: #000000;">f</span><span style="color: #0000FF;">(</span><span style="color: #004080;">integer</span> <span style="color: #000000;">x</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">return</span> <span style="color: #7060A8;">mod</span><span style="color: #0000FF;">(</span><span style="color: #000000;">x</span><span style="color: #0000FF;">*</span><span style="color: #000000;">x</span><span style="color: #0000FF;">+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">255</span><span style="color: #0000FF;">)</span>
Line 1,801 ⟶ 1,884:
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">" The length of the Cycle = %d\n"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">len</span><span style="color: #0000FF;">})</span>
<span style="color: #0000FF;">?</span><span style="color: #000000;">s</span><span style="color: #0000FF;">[</span><span style="color: #000000;">pos</span><span style="color: #0000FF;">..</span><span style="color: #000000;">pos</span><span style="color: #0000FF;">+</span><span style="color: #000000;">len</span><span style="color: #0000FF;">-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]</span>
<!--</langsyntaxhighlight>-->
{{out}}
<pre>
Line 1,812 ⟶ 1,895:
 
=={{header|PL/M}}==
<langsyntaxhighlight lang="plm">100H:
/* CP/M CALLS */
BDOS: PROCEDURE (FN, ARG); DECLARE FN BYTE, ARG ADDRESS; GO TO 5; END BDOS;
Line 1,909 ⟶ 1,992:
CALL PRINT$RANGE(.F$ADDR, 3, MU, MU+LAM);
CALL EXIT;
EOF</langsyntaxhighlight>
{{out}}
<pre>3 10 101 2 5 26 167 95 101 2 5 26 167 95 101 2 5 26 167 95
Line 1,918 ⟶ 2,001:
===Procedural===
Function from the Wikipedia article:
<langsyntaxhighlight lang="python">import itertools
 
def brent(f, x0):
Line 1,960 ⟶ 2,043:
print("Cycle length: %d" % lam)
print("Cycle start index: %d" % mu)
print("Cycle: %s" % list(itertools.islice(iterate(f, x0), mu, mu+lam)))</langsyntaxhighlight>
{{out}}
<pre>
Line 1,969 ⟶ 2,052:
 
A modified version of the above where the first stage is restructured for clarity:
<langsyntaxhighlight lang="python">import itertools
 
def brent_length(f, x0):
Line 2,014 ⟶ 2,097:
print("Cycle length: %d" % lam)
print("Cycle start index: %d" % mu)
print("Cycle: %s" % list(itertools.islice(iterate(f, x0), mu, mu+lam)))</langsyntaxhighlight>
{{out}}
<pre>Cycle length: 6
Line 2,024 ⟶ 2,107:
{{Trans|Haskell}}
{{Works with|Python|3.7}}
<langsyntaxhighlight lang="python">'''Cycle detection by recursion.'''
 
from itertools import (chain, cycle, islice)
Line 2,257 ⟶ 2,340:
# MAIN ---
if __name__ == '__main__':
main()</langsyntaxhighlight>
{{Out}}
<pre>First cycle detected, if any:
Line 2,271 ⟶ 2,354:
 
Recursive ''until'':
<langsyntaxhighlight lang="python"># until :: (a -> Bool) -> (a -> a) -> a -> a
def until(p):
'''The result of repeatedly applying f until p holds.
Line 2,277 ⟶ 2,360:
def go(f, x):
return x if p(x) else go(f, f(x))
return lambda f: lambda x: go(f, x)</langsyntaxhighlight>
 
''cycleLength'' refactored in terms of ''until'':
<langsyntaxhighlight lang="python"># cycleLength :: Eq a => [a] -> Maybe Int
def cycleLength(xs):
'''Just the length of the first cycle found,
Line 2,306 ⟶ 2,389:
) if ys else Nothing()
else:
return Nothing()</langsyntaxhighlight>
 
Iterative reimplementation of ''until'':
<langsyntaxhighlight lang="python"># until_ :: (a -> Bool) -> (a -> a) -> a -> a
def until_(p):
'''The result of repeatedly applying f until p holds.
Line 2,318 ⟶ 2,401:
v = f(v)
return v
return lambda f: lambda x: go(f, x)</langsyntaxhighlight>
 
 
Line 2,324 ⟶ 2,407:
The Python no longer falls out of the tree at the sight of an ouroboros, and we can happily search for cycles in lists of several thousand items:
{{Works with|Python|3.7}}
<langsyntaxhighlight lang="python">'''Cycle detection without recursion.'''
 
from itertools import (chain, cycle, islice)
Line 2,579 ⟶ 2,662:
# MAIN ---
if __name__ == '__main__':
main()</langsyntaxhighlight>
{{Out}}
<pre>First cycle detected, if any:
Line 2,587 ⟶ 2,670:
[1..10000] -> No cycle found
f(x) = (x*x + 1) modulo 255 -> [101,2,5,26,167,95] (from:2, length:6)</pre>
 
 
=={{header|Quackery}}==
 
<syntaxhighlight lang="quackery"> [ stack ] is fun ( --> s )
[ stack ] is pow ( --> s )
[ stack ] is len ( --> s )
 
[ fun put
1 pow put
1 len put
dup fun share do
[ 2dup != while
len share
pow share = if
[ nip dup
pow share
pow tally
0 len replace ]
fun share do
1 len tally
again ]
2drop
fun release
pow release
len take ] is cyclelen ( n x --> n )
 
[ 0 temp put
dip [ fun put dup ]
times [ fun share do ]
[ 2dup != while
fun share do
dip [ fun share do ]
1 temp tally
again ]
2drop
fun release
temp take ] is cyclepos ( n x n --> n )
 
[ 2dup cyclelen
dup dip cyclepos ] is brent ( n x --> n n )
 
[ 2dup
20 times
[ over echo sp
tuck do swap ]
cr cr
2drop
brent
say "cycle length is "
echo cr
say "cycle starts at "
echo ] is task ( n x --> )
 
3 ' [ 2 ** 1+ 255 mod ] task</syntaxhighlight>
 
{{out}}
 
<pre>3 10 101 2 5 26 167 95 101 2 5 26 167 95 101 2 5 26 167 95
 
cycle length is 6
cycle starts at 2
</pre>
 
=={{header|Racket}}==
 
I feel a bit bad about overloading λ, but it&rsquo;s in the spirit of the algorithm.
<langsyntaxhighlight lang="racket">
#lang racket/base
 
Line 2,630 ⟶ 2,776:
(let-values (([µ λ] (brent f 3)))
(printf "Cycle length = ~a~%Start Index = ~a~%" µ λ)))
</syntaxhighlight>
</lang>
 
{{out}}
Line 2,644 ⟶ 2,790:
Pretty much a line for line translation of the Python code on the Wikipedia page.
 
<syntaxhighlight lang="raku" perl6line>sub cyclical-function (\x) { (x * x + 1) % 255 };
 
my ( $l, $s ) = brent( &cyclical-function, 3 );
Line 2,677 ⟶ 2,823:
}
return $λ, $μ;
}</langsyntaxhighlight>
{{out}}
<pre>3, 10, 101, 2, 5, 26, 167, 95, 101, 2, 5, 26, 167, 95, 101, 2, 5, 26, 167, 95, ...
Line 2,686 ⟶ 2,832:
=={{header|REXX}}==
===Brent's algorithm===
<langsyntaxhighlight lang="rexx">/*REXX program detects a cycle in an iterated function [F] using Brent's algorithm. */
init= 3; $= init
do until length($)>79; $= $ f( word($, words($) ) )
Line 2,719 ⟶ 2,865:
return # mu
/*──────────────────────────────────────────────────────────────────────────────────────*/
f: return ( arg(1) **2 + 1) // 255 /*this defines/executes the function F.*/</langsyntaxhighlight>
{{out|output|text=&nbsp; when using the defaults:}}
<pre>
Line 2,730 ⟶ 2,876:
 
===sequential search algorithm===
<langsyntaxhighlight lang="rexx">/*REXX program detects a cycle in an iterated function [F] using a sequential search. */
x= 3; $= x /*initial couple of variables*/
do until cycle\==0; x= f(x) /*calculate another number. */
Line 2,743 ⟶ 2,889:
exit /*stick a fork in it, we're all done. */
/*──────────────────────────────────────────────────────────────────────────────────────*/
f: return ( arg(1) **2 + 1) // 255 /*this defines/executes the function F.*/</langsyntaxhighlight>
{{out|output|:}}
<pre>
Line 2,755 ⟶ 2,901:
===hash table algorithm===
This REXX version is a lot faster &nbsp; (than the sequential search algorithm) &nbsp; if the &nbsp; ''cycle length'' &nbsp; and/or &nbsp; ''start index'' &nbsp; is large.
<langsyntaxhighlight lang="rexx">/*REXX program detects a cycle in an iterated function [F] using a hash table. */
!.= .; !.x= 1; x= 3; $= x /*assign initial value. */
do #=1+words($); x= f(x); $= $ x /*add the number to list.*/
Line 2,768 ⟶ 2,914:
exit /*stick a fork in it, we're all done. */
/*──────────────────────────────────────────────────────────────────────────────────────*/
f: return ( arg(1) **2 + 1) // 255 /*this defines/executes the function F.*/</langsyntaxhighlight>
{{out|output|text=&nbsp; is identical to the 2<sup>nd</sup> REXX version.}} <br><br>
 
Line 2,781 ⟶ 2,927:
<br>test the hash table algorithm. &nbsp; A divisor which is &nbsp; <big> ''two raised to the 49<sup>th</sup> power'' </big> &nbsp; was chosen; &nbsp; it
<br>generates a cyclic sequence that contains over 1.5 million numbers.
<langsyntaxhighlight lang="rexx">/*REXX program detects a cycle in an iterated function [F] using a robust hashing. */
parse arg power . /*obtain optional args from C.L. */
if power=='' | power="," then power=8 /*Not specified? Use the default*/
Line 2,805 ⟶ 2,951:
exit /*stick a fork in it, we're all done. */
/*──────────────────────────────────────────────────────────────────────────────────────*/
f: return ( arg(1) **2 + 1) // 255 /*this defines/executes the function F.*/</langsyntaxhighlight>
{{out|output|text= &nbsp; when the input (power of two) used is: &nbsp; &nbsp; <tt> 49 </tt>}}
<pre>
Line 2,821 ⟶ 2,967:
There is more information in the "hash table"<br>
and f has no "side effect".
<langsyntaxhighlight lang="rexx">/*REXX pgm detects a cycle in an iterated function [F] */
x=3; list=x; p.=0; p.x=1
Do q=2 By 1
Line 2,838 ⟶ 2,984:
Exit
/*-------------------------------------------------------------------*/
f: Return (arg(1)**2+1)// 255; /*define the function F*/</langsyntaxhighlight>
 
=={{header|RPL}}==
Translation of the Brent algorithm given in Wikipedia.
{{works with|HP|48}}
≪ 1 1 0 → f x0 power lam mu
≪ x0 DUP f EVAL <span style="color:grey">@ Main phase: search successive powers of two</span>
'''WHILE''' DUP2 ≠ '''REPEAT'''
'''IF''' power lam == '''THEN''' <span style="color:grey">@ time to start a new power of two?</span>
SWAP DROP DUP
2 'power' STO*
0 'lam' STO
'''END'''
f EVAL
1 'lam' STO+
'''END'''
DROP2 x0 DUP <span style="color:grey">@ Find the position of the first repetition of length λ</span>
0 lam 1 - '''START'''
f EVAL '''NEXT''' <span style="color:grey">@ distance between the hare and tortoise is now λ</span>
'''WHILE''' DUP2 ≠ '''REPEAT''' <span style="color:grey">@ the hare and tortoise move at same speed until they agree</span>
f EVAL SWAP
f EVAL SWAP
1 'mu' STO+
'''END'''
DROP2 lam mu
≫ ≫ '<span style="color:blue">CYCLEB</span>' STO
 
≪ SQ 1 + 255 MOD ≫ 0 <span style="color:blue">CYCLEB</span>
{{out}}
<pre>
2: 6
1: 2
</pre>
 
=={{header|Ruby}}==
{{works with|ruby|2.0}}
 
<langsyntaxhighlight Rubylang="ruby"># Author: Paul Anton Chernoch
# Purpose:
# Find the cycle length and start position of a numerical seried using Brent's cycle algorithm.
Line 2,900 ⟶ 3,078:
# Test the findCycle function
clength, cstart = findCycle(3) { |x| f(x) }
puts "Cycle length = #{clength}\nStart index = #{cstart}"</langsyntaxhighlight>
 
{{out}}
Line 2,912 ⟶ 3,090:
=== Procedural ===
{{Out}}Best seen in running your browser either by [https://scalafiddle.io/sf/6O7WjnO/0 ScalaFiddle (ES aka JavaScript, non JVM)] or [https://scastie.scala-lang.org/kPCg0fxOQQCZPkOnmMR0Kg Scastie (remote JVM)].
<langsyntaxhighlight Scalalang="scala">object CycleDetection extends App {
 
def brent(f: Int => Int, x0: Int): (Int, Int) = {
Line 2,956 ⟶ 3,134:
println(s"Cycle = ${cycle.force}")
 
}</langsyntaxhighlight>
 
=== Functional ===
<syntaxhighlight lang="scala">
<lang Scala>
import scala.annotation.tailrec
 
Line 3,022 ⟶ 3,200:
 
}
</syntaxhighlight>
</lang>
 
{{out}}
Line 3,033 ⟶ 3,211:
=={{header|Sidef}}==
{{trans|Raku}}
<langsyntaxhighlight lang="ruby">func brent (f, x0) {
var power = 1
var λ = 1
Line 3,076 ⟶ 3,254:
say "Cycle length #{l}.";
say "Cycle start index #{s}."
say [seq[s .. (s + l - 1)]]</langsyntaxhighlight>
{{out}}
<pre>3, 10, 101, 2, 5, 26, 167, 95, 101, 2, 5, 26, 167, 95, 101, 2, 5, 26, 167, 95, ...
Line 3,085 ⟶ 3,263:
=={{header|Visual Basic .NET}}==
{{trans|C#}}
<langsyntaxhighlight lang="vbnet">Module Module1
 
Function FindCycle(Of T As IEquatable(Of T))(x0 As T, yielder As Func(Of T, T)) As Tuple(Of Integer, Integer)
Line 3,143 ⟶ 3,321:
End Sub
 
End Module</langsyntaxhighlight>
{{out}}
<pre>3,10,101,2,5,26,167,95,101,2,5,26,167,95,101,2,5,26,167,95,101,2,5,26,167,95,101,2,5,26,167,95,101,2,5,26,167,95,101,2,5
Line 3,151 ⟶ 3,329:
=={{header|Wren}}==
Working from the code in the Wikipedia article:
<langsyntaxhighlight ecmascriptlang="wren">var brent = Fn.new { |f, x0|
var lam = 1
var power = 1
Line 3,190 ⟶ 3,368:
System.print("Cycle length = %(lam)")
System.print("Start index = %(mu)")
System.print("Cycle = %(seq[mu...mu+lam])")</langsyntaxhighlight>
 
{{out}}
Line 3,202 ⟶ 3,380:
=={{header|zkl}}==
Algorithm from the Wikipedia
<langsyntaxhighlight lang="zkl">fcn cycleDetection(f,x0){ // f(int), x0 is the integer starting value of the sequence
# main phase: search successive powers of two
power:=lam:=1;
Line 3,224 ⟶ 3,402:
}
return(lam,mu);
}</langsyntaxhighlight>
<langsyntaxhighlight lang="zkl">cycleDetection(fcn(x){ (x*x + 1)%255 }, 3).println(" == cycle length, start index");</langsyntaxhighlight>
{{out}}
<pre>
9,476

edits