Context
After "Computing a specific coefficient in a product of polynomials", asking you to compute a specific coefficient of polynomial multiplication, I wish to create a "mirror" challenge, asking you to compute a specific coefficient from polynomial division.
Polynomial division
Let us establish an analogy with integer division. If you have two integers a and b, then there is a unique way of writing a = qb + r, with q, r integers and 0 <= r < b.
Let p(x), a(x) be two polynomials. Then there is a unique way of writing a(x) = q(x)p(x) + r(x), where q(x), r(x) are two polynomials and the degree of r(x) is strictly less than the degree of p(x).
Algorithm
Polynomial division can be performed through an iterative algorithm:
- Initialize the quotient at
q(x) = 0 - While the degree of
a(x)is at least as big as the degree ofp(x):- let
n = degree(a) - degree(p), letAbe the coefficient of the term of highest degree ina(x)andPbe the coefficient of highest degree inp(x). - do
q(x) = q(x) + (A/P)x^n - update
a(x) = a(x) - p(x)(A/P)x^n
- let
q(x)is the quotient and what is left ata(x)is the remainder, which for our case will always be0.
Task
Given two polynomials a(x), p(x) such that there exists q(x) satisfying a(x) = p(x)q(x) (with all three polynomials having integer coefficients), find the coefficient of q(x) of degree k.
(Yes, we are assuming the remainder is 0)
Input
Two polynomials (with integer coefficients) and an integer.
Each input polynomial can be in any sensible format. A few suggestions come to mind:
- A string, like
"1 + 3x + 5x^2" - A list of coefficients where index encodes exponent, like
[1, 3, 5] - A list of
(coefficient, exponent)pairs, like[(1, 0), (3, 1), (5, 2)]
An input format must be sensible AND completely unambiguous over the input space.
The integer k is a non-negative integer. You may take it in any of the usual ways. You can assume k is less than or equal to the differences of the degrees of a(x) and p(x), i.e. k <= deg(a) - deg(p) and you can assume deg(a) >= deg(p).
Output
The integer corresponding to the coefficient of x^k in the polynomial q(x) that satisfies the equality a(x) = q(x)p(x).
Test cases
The input order for the test cases is a(x), p(x), integer k.
[12], [4], 0 -> 3
[0, 0, 6], [0, 3], 0 -> 0
[0, 0, 6], [0, 3], 1 -> 2
[0, 70, 70, 17, 70, 61, 6], [0, 10, 10, 1], 0 -> 7
[0, 70, 70, 17, 70, 61, 6], [0, 10, 10, 1], 1 -> 0
[0, 70, 70, 17, 70, 61, 6], [0, 10, 10, 1], 2 -> 1
[0, 70, 70, 17, 70, 61, 6], [0, 10, 10, 1], 3 -> 6
[0, -50, 20, -35, -173, -80, 2, -9, -10, -1], [0, 10, 10, 1], 0 -> -5
[0, -50, 20, -35, -173, -80, 2, -9, -10, -1], [0, 10, 10, 1], 1 -> 7
[0, -50, 20, -35, -173, -80, 2, -9, -10, -1], [0, 10, 10, 1], 2 -> -10
[0, -50, 20, -35, -173, -80, 2, -9, -10, -1], [0, 10, 10, 1], 3 -> -8
[0, -50, 20, -35, -173, -80, 2, -9, -10, -1], [0, 10, 10, 1], 4 -> 1
[0, -50, 20, -35, -173, -80, 2, -9, -10, -1], [0, 10, 10, 1], 5 -> 0
[0, -50, 20, -35, -173, -80, 2, -9, -10, -1], [0, 10, 10, 1], 6 -> -1
This is code-golf so shortest submission in bytes, wins! If you liked this challenge, consider upvoting it... And happy golfing!
(This is not part of the RGS Golfing Showdown)
5 Answers 5
MATL, 6 bytes
Y-PiQ)
The inputs contain the coefficients in order of decreasing powers.
Try it online! Or verify all test cases
Explanation
% Implicit inputs: two numerical vectors
Y- % Deconvolution
P % Flip
i % Input: integer
Q % Add 1
) % Get the entry at that position
% Implicit display
-
1\$\begingroup\$ Really short answer! Didn't know of that "deconvolution" operation \$\endgroup\$RGS– RGS2020年02月25日 12:08:40 +00:00Commented Feb 25, 2020 at 12:08
-
\$\begingroup\$ Nice you managed to reduce the byte count! \$\endgroup\$RGS– RGS2020年02月25日 12:06:47 +00:00Commented Feb 25, 2020 at 12:06
-
\$\begingroup\$ A different approach with the same byte count:
Limit[D[#/#2,{x,#3}]/#3!,x->0]&(It calculates the kth-order coefficient in the Taylor series of the quotient, which will just be the polynomial coefficient. Note that setting x to 0 via... /.x->0doesn't work for all polynomials.) \$\endgroup\$Michael Seifert– Michael Seifert2020年02月25日 21:22:17 +00:00Commented Feb 25, 2020 at 21:22 -
\$\begingroup\$ Unfortunately,
SeriesCoefficient[#/#2,{x,0,#3}]&is two bytes longer. \$\endgroup\$Michael Seifert– Michael Seifert2020年02月25日 21:28:28 +00:00Commented Feb 25, 2020 at 21:28 -
\$\begingroup\$ @MichaelSeifert yes, I tried many things myself but they didn't work for all cases... \$\endgroup\$ZaMoC– ZaMoC2020年02月25日 22:28:19 +00:00Commented Feb 25, 2020 at 22:28
JavaScript (ES6), 81 bytes
Takes input as (a,p,k). The polynomial coefficients are expected from highest to lowest.
(a,[c,...p],k)=>a.slice(p.length+k).map((_,n)=>p.map(v=>a[++n]-=v*q,q=a[n]/c))&&q
-
\$\begingroup\$ What is going on with the &&q at the end? Is it just to return the coefficient you want?
qstores the intermediate coefficients of the quotient, right? \$\endgroup\$RGS– RGS2020年02月25日 12:08:07 +00:00Commented Feb 25, 2020 at 12:08 -
1\$\begingroup\$ @RGS Yes, the last \$q\$ is the answer. \$\endgroup\$Arnauld– Arnauld2020年02月25日 18:45:35 +00:00Commented Feb 25, 2020 at 18:45
Python 3, (削除) 51 49 (削除ここまで) 48 bytes
Input: a, p, k. The format for the polynomials a and p is a list of coefficients, in order of highest to lowest degree.
lambda*p,k:numpy.polydiv(*p)[0][~k]
import numpy
-
\$\begingroup\$ Turns out importing numpy gives a really short answer! +1 well played \$\endgroup\$RGS– RGS2020年02月25日 23:39:52 +00:00Commented Feb 25, 2020 at 23:39
-
\$\begingroup\$ I see :p really short submission! Good job +1 \$\endgroup\$RGS– RGS2020年02月26日 07:55:40 +00:00Commented Feb 26, 2020 at 7:55
xand counted wrong :p fixed! \$\endgroup\$