Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "polynomial.h"
- polynomial::polynomial(){}
- polynomial::polynomial(double d)
- {
- monomial* m = new monomial(d);
- this->ms.push_back(m);
- }
- polynomial::polynomial(const polynomial& p){
- for (unsigned int i = 0; i < p.ms.size(); i++){
- monomial* m = new monomial(*p.ms[i]);
- this->ms.push_back(m);
- }
- }
- polynomial::polynomial(const polynomial& p, int s, int e, int d){
- for (int i = s; i <= e; i++){
- monomial* m = new monomial(*p.ms[i]);
- m->setDeg(m->getDeg() - d);
- this->ms.push_back(m);
- }
- }
- polynomial::polynomial(const monomial& m){
- monomial* nm = new monomial(m);
- this->ms.push_back(nm);
- }
- polynomial::polynomial(double** t, int n){
- for (int i = 0; i < n; i++){
- monomial* m = new monomial(t[i][0], (int)t[i][1]);
- this->ms.push_back(m);
- }
- }
- int polynomial::dt = 0;
- polynomial::~polynomial()
- {
- clock_t t = clock();
- for (unsigned int i = 0; i < this->ms.size(); i++){
- delete this->ms[i];
- }
- this->ms.clear();
- polynomial::dt += (int)(clock() - t);
- }
- ostream& operator<<(ostream& out, const polynomial& p){
- unsigned int i = 0;
- for (; i < p.ms.size() - 1; i++){
- out << *p.ms[i] << " + ";
- }
- if (i < p.ms.size())
- out << *p.ms[i];
- return out;
- }
- polynomial* polynomial::operator+=(const monomial& m){
- if (m.getCoef() == 0)
- return this;
- int low = 0;
- int high = this->ms.size() - 1;
- double mid2 = 0; int mid = 0;
- if (this->ms.size() == 0){
- monomial* nm = new monomial(m);
- this->ms.push_back(nm);
- return this;
- }
- while (this->ms[low]->getDeg() <= m.getDeg() && this->ms[high]->getDeg() >= m.getDeg()) {
- mid2 = round(low + ((m.getDeg() - this->ms[low]->getDeg()) * (high - low)) / (double)(this->ms[high]->getDeg() - this->ms[low]->getDeg()));
- mid = (int)mid2;
- if (this->ms[mid]->getDeg() < m.getDeg()) {
- low = mid + 1;
- }
- else if (this->ms[mid]->getDeg() > m.getDeg()) {
- high = mid - 1;
- }
- else {
- monomial* tm = this->ms[mid];
- tm->setCoef(tm->getCoef() + m.getCoef());
- return this;
- }
- }
- if (this->ms[low]->getDeg() == m.getDeg()) {
- monomial* tm = this->ms[low];
- tm->setCoef(tm->getCoef() + m.getCoef());
- }
- else {
- monomial* nm = new monomial(m);
- if (m.getDeg() > this->ms[high]->getDeg()){
- this->ms.insert(this->ms.begin() + (high+1), nm);
- }
- else{
- this->ms.insert(this->ms.begin() + low, nm);
- }
- }
- return this;
- }
- polynomial* polynomial::operator+(const polynomial& p){
- polynomial* r = new polynomial(*this);
- unsigned int i = 0;
- while (i < p.ms.size()){
- *r += *p.ms[i];
- i++;
- }
- return r;
- }
- polynomial* polynomial::operator-=(const monomial& m){
- if (m.getCoef()==0)
- return this;
- int low = 0;
- int high = this->ms.size() - 1;
- double mid2 = 0; int mid = 0;
- if (this->ms.size() == 0){
- monomial* nm = new monomial(-m.getCoef(),m.getDeg());
- this->ms.push_back(nm);
- return this;
- }
- while (this->ms[low]->getDeg() <= m.getDeg() && this->ms[high]->getDeg() >= m.getDeg()) {
- mid2 = round(low + ((m.getDeg() - this->ms[low]->getDeg()) * (high - low)) / (double)(this->ms[high]->getDeg() - this->ms[low]->getDeg()));
- mid = (int)mid2;
- if (this->ms[mid]->getDeg() < m.getDeg()) {
- low = mid + 1;
- }
- else if (this->ms[mid]->getDeg() > m.getDeg()) {
- high = mid - 1;
- }
- else {
- this->ms[mid]->setCoef(this->ms[mid]->getCoef() - m.getCoef());
- return this;
- }
- }
- if (this->ms[low]->getDeg() == m.getDeg()) {
- this->ms[low]->setCoef(this->ms[low]->getCoef() - m.getCoef());
- }
- else {
- monomial* nm = new monomial(-m.getCoef(), m.getDeg());
- if (m.getDeg() > this->ms[high]->getDeg()){
- this->ms.insert(this->ms.begin() + (high + 1), nm);
- }
- else{
- this->ms.insert(this->ms.begin() + low, nm);
- }
- }
- return this;
- }
- polynomial* polynomial::operator-(const polynomial& p){
- polynomial* r = new polynomial(*this);
- unsigned int i = 0;
- while (i < p.ms.size()){
- *r -= *p.ms[i];
- i++;
- }
- return r;
- }
- polynomial* polynomial::operator*=(const monomial& m){
- unsigned int i = 0;
- while (i < this->ms.size()){
- this->ms[i]->setCoef(this->ms[i]->getCoef()*m.getCoef());
- this->ms[i]->setDeg(this->ms[i]->getDeg() + m.getDeg());
- i++;
- }
- return this;
- }
- polynomial* polynomial::operator*(const polynomial& p){
- unsigned int i = 0;
- polynomial *res = new polynomial();
- while (i < p.ms.size()){
- polynomial *thi = new polynomial(*this);
- *thi *= *p.ms[i];
- polynomial *tmp = *res + *thi;
- delete res;
- delete thi;
- res = tmp;
- i++;
- }
- return res;
- }
- unsigned int polynomial::size(){
- return this->ms.size();
- }
- polynomial* polynomial::mul(const polynomial& p){
- return this->mul(p, 0, this->ms.size() - 1, 0, p.ms.size() - 1);
- }
- int polynomial::steps = 0;
- polynomial* polynomial::mul(const polynomial& p, int s, int e, int sp, int ep) const{
- if (s >= e - 31 || sp >= ep - 31){
- polynomial *a = new polynomial(*this, s, e);
- polynomial *b = new polynomial(p, sp, ep);
- polynomial *c = *a * *b;
- delete a;
- delete b;
- return c;
- }
- if (e - s != ep - sp){
- polynomial* a0b0 = this->mul(p, s, (e - s) / 2 + s, sp, (ep - sp) / 2 + sp);
- polynomial* a0b1 = this->mul(p, s, (e - s) / 2 + s, (ep - sp) / 2 + sp+1, ep);
- polynomial* a1b0 = this->mul(p, (e - s) / 2 + s+1, e, sp, (ep - sp) / 2 + sp);
- polynomial* a1b1 = this->mul(p, (e - s) / 2 + s+1, e, (ep - sp) / 2 + sp+1, ep);
- polynomial* r1 = *a0b0 + *a0b1;
- polynomial* r2 = *a1b0 + *a1b1;
- polynomial* r = *r1 + *r2;
- delete a0b0;
- delete a0b1;
- delete a1b0;
- delete a1b1;
- delete r1;
- delete r2;
- return r;
- }
- polynomial* a0 = new polynomial(*this, s, (e - s) / 2 + s);
- polynomial* a1 = new polynomial(*this, (e - s) / 2 + s + 1, e, this->ms[(e - s) / 2 + s + 1]->getDeg());
- polynomial* b0 = new polynomial(p, sp, (ep - sp) / 2 + sp);
- polynomial* b1 = new polynomial(p, (ep - sp) / 2 + sp + 1, ep, p.ms[(ep - sp) / 2 + sp + 1]->getDeg());
- polynomial* a0pa1 = *a0 + *a1;
- polynomial* b0pb1 = *b0 + *b1;
- polynomial* y = a0pa1->mul(*b0pb1);
- polynomial* u = a0->mul(*b0);
- polynomial* z = a1->mul(*b1);
- monomial *xz = new monomial(1, this->ms[(e - s) / 2 + s ]->getDeg()*p.ms[(ep - sp) / 2 + sp ]->getDeg() ),
- *xy = new monomial(1, this->ms[(e - s) / 2 + s]->getDeg());
- polynomial *ymu = *y - *u, *ymumz = *ymu - *z;
- *ymumz *= *xy;
- *z *= *xz;
- polynomial *upz = *u + *z, *res = *upz + *ymumz;
- delete a0; delete a1; delete b0; delete b1;
- delete a0pa1; delete b0pb1;
- delete y; delete u; delete z;
- delete xz; delete xy;
- delete ymu; delete ymumz; delete upz;
- return res;
- }
- polynomial* polynomial::add(const polynomial& p, int s, int e, int sp, int ep, int d) const{
- polynomial* r = new polynomial(p, s, e);
- for (int i = sp; i <= ep; i++){
- if (d==0)
- *r += *p.ms[i];
- else{
- monomial *m = new monomial(*p.ms[i]);
- m->setCoef(m->getCoef() - d);
- *r += *m;
- }
- }
- return r;
- }
- polynomial* polynomial::simplify(){
- for (int i = 0; i < this->ms.size(); i++){
- if (this->ms[i]->getCoef() == 0){
- this->ms.erase(this->ms.begin() + i);
- i--;
- }
- }
- return this;
- }
- double polynomial::eval(double x){
- int i = 0;
- double res = 0, nx = x;
- while (i<this->ms.size()){
- int p = 0; double tmp = this->ms[i]->getCoef();
- while (p<this->ms[i]->getDeg()){
- tmp *= nx;
- p++;
- }
- res += tmp;
- i++;
- }
- return res;
- }
- polynomial* polynomial::sort(){
- std::sort(this->ms.begin(), this->ms.end(), [](monomial* a, monomial* b) { return a->getDeg() < b->getDeg(); });
- return this;
- }
- polynomial* polynomial::rand(int n){
- polynomial* r = new polynomial;
- mt19937 rng;
- rng.seed(random_device()());
- uniform_int_distribution<mt19937::result_type> dist1(0, 5); // distribution in range [0, 5]
- uniform_int_distribution<mt19937::result_type> dist2(1, n * 2);
- for (int i = 0; i < n; i++){
- int ra = std::rand();
- double coef = dist1(rng);
- double deg = dist2(rng);
- monomial* m = new monomial(coef, (int)deg);
- *r += *m;
- delete m;
- }
- return r;
- }
Advertisement
Add Comment
Please, Sign In to add comment