Polynomial long division: Difference between revisions
Content added Content deleted
(Added APL entry.) |
|||
Line 645: | Line 645: | ||
delete [] r; |
delete [] r; |
||
}</lang> |
}</lang> |
||
=={{header|C#|C sharp}}== |
|||
{{trans|Java}} |
|||
<lang csharp>using System; |
|||
namespace PolynomialLongDivision { |
|||
class Solution { |
|||
public Solution(double[] q, double[] r) { |
|||
Quotient = q; |
|||
Remainder = r; |
|||
} |
|||
public double[] Quotient { get; } |
|||
public double[] Remainder { get; } |
|||
} |
|||
class Program { |
|||
static int PolyDegree(double[] p) { |
|||
for (int i = p.Length - 1; i >= 0; --i) { |
|||
if (p[i] != 0.0) return i; |
|||
} |
|||
return int.MinValue; |
|||
} |
|||
static double[] PolyShiftRight(double[] p, int places) { |
|||
if (places <= 0) return p; |
|||
int pd = PolyDegree(p); |
|||
if (pd + places >= p.Length) { |
|||
throw new ArgumentOutOfRangeException("The number of places to be shifted is too large"); |
|||
} |
|||
double[] d = new double[p.Length]; |
|||
p.CopyTo(d, 0); |
|||
for (int i = pd; i >= 0; --i) { |
|||
d[i + places] = d[i]; |
|||
d[i] = 0.0; |
|||
} |
|||
return d; |
|||
} |
|||
static void PolyMultiply(double[] p, double m) { |
|||
for (int i = 0; i < p.Length; ++i) { |
|||
p[i] *= m; |
|||
} |
|||
} |
|||
static void PolySubtract(double[] p, double[] s) { |
|||
for (int i = 0; i < p.Length; ++i) { |
|||
p[i] -= s[i]; |
|||
} |
|||
} |
|||
static Solution PolyLongDiv(double[] n, double[] d) { |
|||
if (n.Length != d.Length) { |
|||
throw new ArgumentException("Numerator and denominator vectors must have the same size"); |
|||
} |
|||
int nd = PolyDegree(n); |
|||
int dd = PolyDegree(d); |
|||
if (dd < 0) { |
|||
throw new ArgumentException("Divisor must have at least one one-zero coefficient"); |
|||
} |
|||
if (nd < dd) { |
|||
throw new ArgumentException("The degree of the divisor cannot exceed that of the numerator"); |
|||
} |
|||
double[] n2 = new double[n.Length]; |
|||
n.CopyTo(n2, 0); |
|||
double[] q = new double[n.Length]; |
|||
while (nd >= dd) { |
|||
double[] d2 = PolyShiftRight(d, nd - dd); |
|||
q[nd - dd] = n2[nd] / d2[nd]; |
|||
PolyMultiply(d2, q[nd - dd]); |
|||
PolySubtract(n2, d2); |
|||
nd = PolyDegree(n2); |
|||
} |
|||
return new Solution(q, n2); |
|||
} |
|||
static void PolyShow(double[] p) { |
|||
int pd = PolyDegree(p); |
|||
for (int i = pd; i >= 0; --i) { |
|||
double coeff = p[i]; |
|||
if (coeff == 0.0) continue; |
|||
if (coeff == 1.0) { |
|||
if (i < pd) { |
|||
Console.Write(" + "); |
|||
} |
|||
} else if (coeff == -1.0) { |
|||
if (i < pd) { |
|||
Console.Write(" - "); |
|||
} else { |
|||
Console.Write("-"); |
|||
} |
|||
} else if (coeff < 0.0) { |
|||
if (i < pd) { |
|||
Console.Write(" - {0:F1}", -coeff); |
|||
} else { |
|||
Console.Write("{0:F1}", coeff); |
|||
} |
|||
} else { |
|||
if (i < pd) { |
|||
Console.Write(" + {0:F1}", coeff); |
|||
} else { |
|||
Console.Write("{0:F1}", coeff); |
|||
} |
|||
} |
|||
if (i > 1) Console.Write("x^{0}", i); |
|||
else if (i == 1) Console.Write("x"); |
|||
} |
|||
Console.WriteLine(); |
|||
} |
|||
static void Main(string[] args) { |
|||
double[] n = { -42.0, 0.0, -12.0, 1.0 }; |
|||
double[] d = { -3.0, 1.0, 0.0, 0.0 }; |
|||
Console.Write("Numerator : "); |
|||
PolyShow(n); |
|||
Console.Write("Denominator : "); |
|||
PolyShow(d); |
|||
Console.WriteLine("-------------------------------------"); |
|||
Solution sol = PolyLongDiv(n, d); |
|||
Console.Write("Quotient : "); |
|||
PolyShow(sol.Quotient); |
|||
Console.Write("Remainder : "); |
|||
PolyShow(sol.Remainder); |
|||
} |
|||
} |
|||
}</lang> |
|||
{{out}} |
|||
<pre>Numerator : x^3 - 12.0x^2 - 42.0 |
|||
Denominator : x - 3.0 |
|||
------------------------------------- |
|||
Quotient : x^2 - 9.0x - 27.0 |
|||
Remainder : -123.0</pre> |
|||
=={{header|Clojure}}== |
=={{header|Clojure}}== |