Check Machin-like formulas: Difference between revisions

Content added Content deleted
(Updated D entry)
Line 34: Line 34:
This uses the module of the Arithmetic Rational Task.
This uses the module of the Arithmetic Rational Task.
{{trans|Python}}
{{trans|Python}}
<lang d>import std.stdio, std.regex, std.conv, std.string, std.typecons,
<lang d>import std.stdio, std.regex, std.conv, std.string, std.range,
std.array, std.range;
arithmetic_rational;
import arithmetic_rational: Rational;


struct Pair { int x; Rational r; }
immutable equationText =
"pi/4 = arctan(1/2) + arctan(1/3)
pi/4 = 2*arctan(1/3) + arctan(1/7)
pi/4 = 4*arctan(1/5) - arctan(1/239)
pi/4 = 5*arctan(1/7) + 2*arctan(3/79)
pi/4 = 5*arctan(29/278) + 7*arctan(3/79)
pi/4 = arctan(1/2) + arctan(1/5) + arctan(1/8)
pi/4 = 4*arctan(1/5) - arctan(1/70) + arctan(1/99)
pi/4 = 5*arctan(1/7) + 4*arctan(1/53) + 2*arctan(1/4443)
pi/4 = 6*arctan(1/8) + 2*arctan(1/57) + arctan(1/239)
pi/4 = 8*arctan(1/10) - arctan(1/239) - 4*arctan(1/515)
pi/4 = 12*arctan(1/18) + 8*arctan(1/57) - 5*arctan(1/239)
pi/4 = 16*arctan(1/21) + 3*arctan(1/239) + 4*arctan(3/1042)
pi/4 = 22*arctan(1/28) + 2*arctan(1/443) - 5*arctan(1/1393) - 10*arctan(1/11018)
pi/4 = 22*arctan(1/38) + 17*arctan(7/601) + 10*arctan(7/8149)
pi/4 = 44*arctan(1/57) + 7*arctan(1/239) - 12*arctan(1/682) + 24*arctan(1/12943)
pi/4 = 88*arctan(1/172) + 51*arctan(1/239) + 32*arctan(1/682) + 44*arctan(1/5357) + 68*arctan(1/12943)
pi/4 = 88*arctan(1/172) + 51*arctan(1/239) + 32*arctan(1/682) + 44*arctan(1/5357) + 68*arctan(1/12944)";


Pair[][] parseEquations(in string text) /*pure nothrow*/ {
alias Pair = Tuple!(int, Rational);

Pair[][] parseEquations(in string text) {
auto r = regex(r"\s*(?P<sign>[+-])?\s*(?:(?P<mul>\d+)\s*\*)?\s*" ~
auto r = regex(r"\s*(?P<sign>[+-])?\s*(?:(?P<mul>\d+)\s*\*)?\s*" ~
r"arctan\((?P<num>\d+)/(?P<denom>\d+)\)", "g");
r"arctan\((?P<num>\d+)/(?P<denom>\d+)\)");
Pair[][] machins;
Pair[][] machins;
foreach (const line; text.splitLines()) {
foreach (const line; text.splitLines) {
Pair[] formula;
Pair[] formula;
foreach (part; std.string.split(line, "=")[1].match(r)) {
foreach (/*const*/ part; line.split("=")[1].matchAll(r)) {
immutable string mul = part["mul"];
immutable mul = part["mul"],
immutable string num = part["num"];
num = part["num"],
immutable string denom = part["denom"];
denom = part["denom"];
formula ~= Pair((part["sign"] == "-" ? -1 : 1) *
formula ~= Pair((part["sign"] == "-" ? -1 : 1) *
(mul.empty ? 1 : to!int(mul)),
(mul.empty ? 1 : mul.to!int),
Rational(to!int(num),
Rational(num.to!int,
denom.empty ? 1 : to!int(denom)));
denom.empty ? 1 : denom.to!int));
}
}
machins ~= formula;
machins ~= formula;
Line 87: Line 67:
if (coef < 0)
if (coef < 0)
return -tanEval(-coef, f);
return -tanEval(-coef, f);
/*const*/ auto a = tanEval(coef / 2, f);
/*const*/ auto a = tanEval(coef / 2, f),
/*const*/ auto b = tanEval(coef - coef / 2, f);
b = tanEval(coef - coef / 2, f);
return (a + b) / (1 - a * b);
return (a + b) / (1 - a * b);
}
}
Line 94: Line 74:
if (xs.length == 1)
if (xs.length == 1)
return tanEval(xs[0].tupleof);
return tanEval(xs[0].tupleof);
/*const*/ auto a = tans(xs[0 .. xs.length / 2]);
/*const*/ auto a = xs[0 .. $ / 2].tans,
/*const*/ auto b = tans(xs[xs.length / 2 .. $]);
b = xs[$ / 2 .. $].tans;
return (a + b) / (1 - a * b);
return (a + b) / (1 - a * b);
}
}


void main() {
void main() {
immutable equationText =
/*const*/ auto machins = parseEquations(equationText);
"pi/4 = arctan(1/2) + arctan(1/3)
foreach (machin, eqn; zip(machins, equationText.splitLines())) {
pi/4 = 2*arctan(1/3) + arctan(1/7)
/*const*/ auto ans = tans(machin);
pi/4 = 4*arctan(1/5) - arctan(1/239)
pi/4 = 5*arctan(1/7) + 2*arctan(3/79)
pi/4 = 5*arctan(29/278) + 7*arctan(3/79)
pi/4 = arctan(1/2) + arctan(1/5) + arctan(1/8)
pi/4 = 4*arctan(1/5) - arctan(1/70) + arctan(1/99)
pi/4 = 5*arctan(1/7) + 4*arctan(1/53) + 2*arctan(1/4443)
pi/4 = 6*arctan(1/8) + 2*arctan(1/57) + arctan(1/239)
pi/4 = 8*arctan(1/10) - arctan(1/239) - 4*arctan(1/515)
pi/4 = 12*arctan(1/18) + 8*arctan(1/57) - 5*arctan(1/239)
pi/4 = 16*arctan(1/21) + 3*arctan(1/239) + 4*arctan(3/1042)
pi/4 = 22*arctan(1/28) + 2*arctan(1/443) - 5*arctan(1/1393) - 10*arctan(1/11018)
pi/4 = 22*arctan(1/38) + 17*arctan(7/601) + 10*arctan(7/8149)
pi/4 = 44*arctan(1/57) + 7*arctan(1/239) - 12*arctan(1/682) + 24*arctan(1/12943)
pi/4 = 88*arctan(1/172) + 51*arctan(1/239) + 32*arctan(1/682) + 44*arctan(1/5357) + 68*arctan(1/12943)
pi/4 = 88*arctan(1/172) + 51*arctan(1/239) + 32*arctan(1/682) + 44*arctan(1/5357) + 68*arctan(1/12944)";

/*const*/ auto machins = equationText.parseEquations;
foreach (/*const */ machin, const eqn; machins.zip(equationText.splitLines)) {
/*const*/ auto ans = machin.tans;
writefln("%5s: %s", ans == 1 ? "OK" : "ERROR", eqn);
writefln("%5s: %s", ans == 1 ? "OK" : "ERROR", eqn);
}
}