Program to differentiate the given Polynomial

Given a polynomial string str, the task is to differentiate the given string and print the string after differentiating it.

Note: The input format is such that there is a whitespace between a term and the ‘+’, ’-’ symbol

Examples:

Input: str = “4X3 + 3X1 + 2X2
Output: “12X2 + 3X0 + 4X1
Explanation:
The derivative of p(x) = A*XN is p'(x) = A * N * XN – 1

Input: str = “5X4 + 6X2 + 5X2
Output: “20X3 + 12X1 + 10X1



Approach: The idea is to observe that when the given equation consists of multiple polynomials p(x) = p1(x) + p2(x), the differentiation of the given polynomial p'(x) = p1'(x) + p2'(x).

And, it is known that the derivative of p(x) = AX^N is p'(x) = A*N*X^{N - 1}

Therefore, we split the given string and differentiate every term in it.

Below is the implementation of the above approach:

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ program to differentiate the
// given polynomial
  
#include "bits/stdc++.h"
#define MOD (1e9 + 7);
using ll = int64_t;
using ull = uint64_t;
#define ll long long
using namespace std;
  
// Function to differentiate the
// given term
string diffTerm(string pTerm)
{
    // Get the coefficient
    string coeffStr = "", S = "";
    int i;
  
    // Loop to get the coefficient
    for (i = 0; pTerm[i] != 'x'; i++)
        coeffStr.push_back(pTerm[i]);
  
    long long coeff
        = atol(coeffStr.c_str());
  
    // Loop to get the power of each term
    string powStr = "";
    for (i = i + 2; i != pTerm.size(); i++)
        powStr.push_back(pTerm[i]);
  
    long long power
        = atol(powStr.c_str());
    string a, b;
  
    // Converting the value
    // to the string
    ostringstream str1, str2;
  
    // For ax^n, we find (n)*a*x^(n-1)
    coeff = coeff * power;
    str1 << coeff;
    a = str1.str();
    power--;
    str2 << power;
    b = str2.str();
    S += a + "X^" + b;
  
    return S;
}
  
// Function to differentiate the
// given polynomial
string diffstr(string& poly)
{
  
    // We use istringstream to get
    // the input in tokens
    istringstream is(poly);
  
    string pTerm, S = "";
  
    // For every token, compute the
    // differentiation
    while (is >> pTerm) {
  
        // If the token is equal to
        // '+', '-' then
        // continue with the string
        if (pTerm == "+") {
            S += " + ";
            continue;
        }
  
        if (pTerm == "-") {
            S += " - ";
            continue;
        }
  
        // Otherwise find the differentiation
        // of that particular term
        else
            S += diffTerm(pTerm);
    }
    return S;
}
  
// Driver code
int main()
{
    string str = "5x^4 + 6x^2 + 5x^2";
    cout << diffstr(str);
    return 0;
}

chevron_right


Output:

20X^3 + 12X^1 + 10X^1

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.




My Personal Notes arrow_drop_up

Check out this Author's contributed articles.

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.