Related Articles
Partial derivative of a polynomial using Doubly Linked List
• Difficulty Level : Expert
• Last Updated : 23 Nov, 2020

Given a 2-variable polynomial represented by a doubly linked list, the task is to find the partial derivative of a polynomial stored in the doubly-linked list.

Examples:

Input: P(x, y) = 2(x^3 y^4) + 3(x^5 y^7) + 1(x^2 y^6)
Output:
Partial derivatives w.r.t. x: 6(x^2 y^4) + 15(x^4 y^7) + 2(x^1 y^6)
Partial derivatives w.r.t. y: 24(x^2 y^3) + 105(x^4 y^6) + 12(x^1 y^5)
Partial derivatives w.r.t. x and y: 144(x^1 y^2) + 2520(x^3 y^5) + 60(x^0 y^4)

Input: P(x, y) = 3(x^2 y^1) + 4(x^2 y^3) + 2(x^4 y^7)
Output:
Partial derivatives w.r.t. x: 6(x^1 y^1) + 8(x^1 y^3) + 8(x^3 y^7)
Partial derivatives w.r.t. y: 6(x^1 y^0) + 24(x^1 y^2) + 56(x^3 y^6)
Partial derivatives w.r.t. x and y: 48(x^0 y^1) + 1008(x^2 y^5)

## Recommended: Please try your approach on {IDE} first, before moving on to the solution.

Approach: Follow the steps belo to solve this problem:

• Declare a class or structure to store the contents of a node, i.e. data representing the coefficient, power1 representing the power to which x is raised, power2 representing the power to which y is raised, and the pointers to its next and previous node.
• Declare functions to calculate derivatives with respect to x, derivative with respect to y, and derivative with respect to x and y.
• Calculate and print the derivaties obtained.

Below is the implementation of the above approach:

## C++

 `// C++ program for the above approach ` ` `  `#include ` `using` `namespace` `std; ` ` `  `// Structure of a node ` `struct` `node { ` `    ``node* link1 = NULL; ` `    ``node* link2 = NULL; ` `    ``int` `data = 0; ` `    ``int` `pow1 = 0; ` `    ``int` `pow2 = 0; ` `}; ` ` `  `// Function to generate Doubly Linked ` `// List from given parametrs ` `void` `input_equation(node*& head, ``int` `d, ` `                    ``int` `p1, ``int` `p2) ` `{ ` `    ``node* temp = head; ` ` `  `    ``// If list is empty ` `    ``if` `(head == NULL) { ` ` `  `        ``// Create new node ` `        ``node* ptr = ``new` `node(); ` `        ``ptr->data = d; ` `        ``ptr->pow1 = p1; ` `        ``ptr->pow2 = p2; ` ` `  `        ``// Set it as the head ` `        ``// of the linked list ` `        ``head = ptr; ` `    ``} ` ` `  `    ``// If list is not empty ` `    ``else` `{ ` ` `  `        ``// Temporarily store ` `        ``// address of the head node ` `        ``temp = head; ` ` `  `        ``// Traverse the linked list ` `        ``while` `(temp->link2 != NULL) { ` ` `  `            ``// Link to next node ` `            ``temp = temp->link2; ` `        ``} ` ` `  `        ``// Create new node ` `        ``node* ptr = ``new` `node(); ` `        ``ptr->data = d; ` `        ``ptr->pow1 = p1; ` `        ``ptr->pow2 = p2; ` ` `  `        ``// Connect the nodes ` `        ``ptr->link1 = temp; ` `        ``temp->link2 = ptr; ` `    ``} ` `} ` ` `  `// Function to calculate partial ` `// derivative w.r.t. X ` `void` `derivation_with_x(node*& head) ` `{ ` `    ``cout << ``"Partial derivatives"` `         ``<< ``" w.r.t. x: "``; ` ` `  `    ``node* temp = head; ` ` `  `    ``// Traverse the Linked List ` `    ``while` `(temp != NULL) { ` ` `  `        ``if` `(temp->pow1 != 0) { ` `            ``temp->data = (temp->data) ` `                         ``* (temp->pow1); ` `            ``temp->pow1 = temp->pow1 - 1; ` `        ``} ` `        ``else` `{ ` `            ``temp->data = 0; ` `            ``temp->pow1 = 0; ` `            ``temp->pow2 = 0; ` `        ``} ` ` `  `        ``temp = temp->link2; ` `    ``} ` ` `  `    ``temp = head; ` ` `  `    ``cout << ``" "` `<< temp->data ` `         ``<< ``"(x^"` `<< temp->pow1 ` `         ``<< ``" y^"` `<< temp->pow2 ` `         ``<< ``")"``; ` `    ``temp = temp->link2; ` ` `  `    ``while` `(temp != NULL) { ` `        ``cout << ``" + "` `             ``<< temp->data << ``"(x^"` `             ``<< temp->pow1 << ``" y^"` `             ``<< temp->pow2 << ``")"``; ` `        ``temp = temp->link2; ` `    ``} ` ` `  `    ``cout << ``"\n"``; ` `} ` ` `  `// Function to calculate partial ` `// derivative w.r.t. Y ` `void` `derivation_with_y(node*& head) ` `{ ` `    ``cout << ``"Partial derivatives"` `         ``<< ``" w.r.t. y: "``; ` ` `  `    ``node* temp = head; ` ` `  `    ``// Traverse the Linked List ` `    ``while` `(temp != NULL) { ` ` `  `        ``if` `(temp->pow2 != 0) { ` `            ``temp->data = (temp->data) ` `                         ``* (temp->pow2); ` `            ``temp->pow2 = temp->pow2 - 1; ` `        ``} ` `        ``else` `{ ` `            ``temp->data = 0; ` `            ``temp->pow1 = 0; ` `            ``temp->pow2 = 0; ` `        ``} ` ` `  `        ``temp = temp->link2; ` `    ``} ` ` `  `    ``temp = head; ` `    ``cout << ``" "` `         ``<< temp->data ` `         ``<< ``"(x^"` `<< temp->pow1 ` `         ``<< ``" y^"` `         ``<< temp->pow2 << ``")"``; ` `    ``temp = temp->link2; ` ` `  `    ``while` `(temp != NULL) { ` `        ``cout << ``" + "` `             ``<< temp->data << ``"(x^"` `             ``<< temp->pow1 << ``" y^"` `             ``<< temp->pow2 << ``")"``; ` `        ``temp = temp->link2; ` `    ``} ` `    ``cout << ``"\n"``; ` `} ` ` `  `// Function to calculate partial ` `// derivative w.r.t. XY ` `void` `derivation_with_x_y(node*& head) ` `{ ` `    ``cout << ``"Partial derivatives"` `         ``<< ``" w.r.t. x and y: "``; ` ` `  `    ``node* temp = head; ` ` `  `    ``// Derivative with respect to ` `    ``// the first variable ` `    ``while` `(temp != NULL) { ` `        ``if` `(temp->pow1 != 0) { ` ` `  `            ``temp->data = (temp->data) ` `                         ``* (temp->pow1); ` `            ``temp->pow1 = temp->pow1 - 1; ` `        ``} ` ` `  `        ``else` `{ ` `            ``temp->data = 0; ` `            ``temp->pow1 = 0; ` `            ``temp->pow2 = 0; ` `        ``} ` ` `  `        ``temp = temp->link2; ` `    ``} ` `    ``temp = head; ` ` `  `    ``// Derivative with respect to ` `    ``// the second variable ` `    ``while` `(temp != NULL) { ` ` `  `        ``if` `(temp->pow2 != 0) { ` `            ``temp->data = (temp->data) ` `                         ``* (temp->pow2); ` `            ``temp->pow2 = temp->pow2 - 1; ` `        ``} ` ` `  `        ``else` `{ ` `            ``temp->data = 0; ` `            ``temp->pow1 = 0; ` `            ``temp->pow2 = 0; ` `        ``} ` ` `  `        ``temp = temp->link2; ` `    ``} ` ` `  `    ``temp = head; ` `    ``cout << ``" "` `         ``<< temp->data << ``"(x^"` `         ``<< temp->pow1 << ``" y^"` `         ``<< temp->pow2 << ``")"``; ` ` `  `    ``temp = temp->link2; ` ` `  `    ``// Print the list after the ` `    ``// calculating the derivative ` `    ``while` `(temp != NULL) { ` ` `  `        ``cout << ``" + "` `             ``<< temp->data << ``"(x^"` `             ``<< temp->pow1 << ``" y^"` `             ``<< temp->pow2 << ``")"``; ` `        ``temp = temp->link2; ` `    ``} ` `    ``cout << ``"\n"``; ` `} ` ` `  `// Driver Code ` `int` `main() ` `{ ` `    ``node* head1 = NULL; ` ` `  `    ``// Creating doubly-linked list ` `    ``input_equation(head1, 2, 3, 4); ` `    ``input_equation(head1, 3, 5, 7); ` `    ``input_equation(head1, 1, 2, 6); ` ` `  `    ``// Function Call ` `    ``derivation_with_x(head1); ` `    ``derivation_with_y(head1); ` `    ``derivation_with_x_y(head1); ` ` `  `    ``return` `0; ` `} `

Output:

```Partial derivatives w.r.t. x:  6(x^2 y^4) + 15(x^4 y^7) + 2(x^1 y^6)
Partial derivatives w.r.t. y:  24(x^2 y^3) + 105(x^4 y^6) + 12(x^1 y^5)
Partial derivatives w.r.t. x and y:  144(x^1 y^2) + 2520(x^3 y^5) + 60(x^0 y^4)
```

Time Complexity: O(N)
Auxiliary Space: O(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
Recommended Articles
Page :