RosettaCodeData/Task/Duffinian-numbers/Refal/duffinian-numbers.refal
2025-02-27 18:35:13 -05:00

76 lines
1.7 KiB
Text

$ENTRY Go {
= <Prout 'First 50 Duffinian numbers:'>
<Each Prout <Group 10 <Gen 50 Duffinian>>>
<Prout>
<Prout 'First 15 Duffinian triples:'>
<Each ShowTriple <Gen 15 DuffinianTriple>>;
};
ShowTriple {
s.N = <Prout s.N <Add 1 s.N> <Add 2 s.N>>;
};
Each {
s.F = ;
s.F t.I e.X = <Mu s.F t.I> <Each s.F e.X>;
};
Group {
s.N = ;
s.N e.X, <First s.N e.X>: (e.1) e.2 = (e.1) <Group s.N e.2>;
};
Gen {
s.N s.F = <Gen s.N s.F 0>;
0 s.F s.I = ;
s.N s.F s.I, <Mu s.F s.I>: {
True = s.I <Gen <Sub s.N 1> s.F <Add s.I 1>>;
False = <Gen s.N s.F <Add s.I 1>>;
};
};
DuffinianTriple {
s.N, <Duffinian s.N>
<Duffinian <Add 1 s.N>>
<Duffinian <Add 2 s.N>>: True True True = True;
s.N = False;
};
Duffinian {
s.N, <SigmaSum s.N>: s.S,
<Add s.N 1>: s.P,
s.S <Gcd s.N s.S>: {
s.P s.1 = False;
s.Q 1 = True;
s.1 s.2 = False;
};
};
Gcd {
s.A 0 = s.A;
s.A s.B = <Gcd s.B <Mod s.A s.B>>;
};
SigmaSum {
s.N = <SigmaSum s.N <Add 1 s.N> 2 <Sqrt s.N>>;
s.N s.Sum s.D s.Max, <Compare s.D s.Max>: '+' = s.Sum;
s.N s.Sum s.D s.Max, <Mul s.D s.D>: s.N = <Add s.Sum s.Max>;
s.N s.Sum s.D s.Max, <Mod s.N s.D>: 0 =
<SigmaSum s.N
<Add s.Sum
<Add s.D <Div s.N s.D>>>
<Add 1 s.D> s.Max>;
s.N s.Sum s.D s.Max = <SigmaSum s.N s.Sum <Add 1 s.D> s.Max>;
};
Sqrt {
0 = 1;
1 = 1;
s.N = <Sqrt s.N <Div s.N 2>>;
s.N s.X0,
<Div <Add s.X0 <Div s.N s.X0>> 2>: s.X1,
<Compare s.X0 s.X1>: {
'+' = <Sqrt s.N s.X1>;
s.C = s.X0;
};
};