#include <stdio.h>
#include <math.h>
#define EPSILON 1e-10
#define MAX_ITER 100
#define ROOT_TOL 1e-4 // tolerance for treating roots as identical
double f(double x) {
return (((x*x*x*x) + x*x*x) - 54.0*x*x - 224.0*x - 345.0);
}
double df(double x) {
return (4.0*x*x*x + 3.0*x*x - 108.0*x - 224.0);
}
double newton(double x0) {
double x = x0;
for (int i = 0; i < MAX_ITER; i++) {
double fx = f(x);
double dfx = df(x);
if (fabs(dfx
) < 1e-12) break;
double dx = fx / dfx;
x -= dx;
if (fabs(dx
) < EPSILON
) return x
; }
return x;
}
int is_duplicate(double x, double roots[], int count) {
for (int i = 0; i < count; i++) {
if (fabs(x
- roots
[i
]) < ROOT_TOL
) return 1; }
return 0;
}
int main() {
double guesses[] = {10.0, 3.0, 1.0, -6.0};
double roots[4];
int found = 0;
printf("=== Newton-Raphson roots (deduplicated) ===\n");
for (int i = 0; i < 4; i++) {
double r = newton(guesses[i]);
if (!is_duplicate(r, roots, found)) {
roots[found++] = r;
printf("Root %d: %.10f\n", found
, r
); }
}
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxtYXRoLmg+CgojZGVmaW5lIEVQU0lMT04gMWUtMTAKI2RlZmluZSBNQVhfSVRFUiAxMDAKCiNkZWZpbmUgUk9PVF9UT0wgMWUtNCAgIC8vIHRvbGVyYW5jZSBmb3IgdHJlYXRpbmcgcm9vdHMgYXMgaWRlbnRpY2FsCgpkb3VibGUgZihkb3VibGUgeCkgewogICAgcmV0dXJuICgoKHgqeCp4KngpICsgeCp4KngpIC0gNTQuMCp4KnggLSAyMjQuMCp4IC0gMzQ1LjApOwp9Cgpkb3VibGUgZGYoZG91YmxlIHgpIHsKICAgIHJldHVybiAoNC4wKngqeCp4ICsgMy4wKngqeCAtIDEwOC4wKnggLSAyMjQuMCk7Cn0KCmRvdWJsZSBuZXd0b24oZG91YmxlIHgwKSB7CiAgICBkb3VibGUgeCA9IHgwOwoKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTUFYX0lURVI7IGkrKykgewogICAgICAgIGRvdWJsZSBmeCA9IGYoeCk7CiAgICAgICAgZG91YmxlIGRmeCA9IGRmKHgpOwoKICAgICAgICBpZiAoZmFicyhkZngpIDwgMWUtMTIpIGJyZWFrOwoKICAgICAgICBkb3VibGUgZHggPSBmeCAvIGRmeDsKICAgICAgICB4IC09IGR4OwoKICAgICAgICBpZiAoZmFicyhkeCkgPCBFUFNJTE9OKSByZXR1cm4geDsKICAgIH0KCiAgICByZXR1cm4geDsKfQoKaW50IGlzX2R1cGxpY2F0ZShkb3VibGUgeCwgZG91YmxlIHJvb3RzW10sIGludCBjb3VudCkgewogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CiAgICAgICAgaWYgKGZhYnMoeCAtIHJvb3RzW2ldKSA8IFJPT1RfVE9MKSByZXR1cm4gMTsKICAgIH0KICAgIHJldHVybiAwOwp9CgppbnQgbWFpbigpIHsKICAgIGRvdWJsZSBndWVzc2VzW10gPSB7MTAuMCwgMy4wLCAxLjAsIC02LjB9OwogICAgZG91YmxlIHJvb3RzWzRdOwogICAgaW50IGZvdW5kID0gMDsKCiAgICBwcmludGYoIj09PSBOZXd0b24tUmFwaHNvbiByb290cyAoZGVkdXBsaWNhdGVkKSA9PT1cbiIpOwoKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSsrKSB7CiAgICAgICAgZG91YmxlIHIgPSBuZXd0b24oZ3Vlc3Nlc1tpXSk7CgogICAgICAgIGlmICghaXNfZHVwbGljYXRlKHIsIHJvb3RzLCBmb3VuZCkpIHsKICAgICAgICAgICAgcm9vdHNbZm91bmQrK10gPSByOwogICAgICAgICAgICBwcmludGYoIlJvb3QgJWQ6ICUuMTBmXG4iLCBmb3VuZCwgcik7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAwOwp9Cg==