aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/factor.c
diff options
context:
space:
mode:
authorrsc <devnull@localhost>2003-11-23 18:04:47 +0000
committerrsc <devnull@localhost>2003-11-23 18:04:47 +0000
commitbc7cb1a15a67c859c8c71c4b52bb35fe9425a63d (patch)
tree8ca0fe4e2418e6aa18dc74a236c577a719f6c6ed /src/cmd/factor.c
parentf08fdedcee12c06e3ce9ac9bec363915978e8289 (diff)
downloadplan9port-bc7cb1a15a67c859c8c71c4b52bb35fe9425a63d.tar.gz
plan9port-bc7cb1a15a67c859c8c71c4b52bb35fe9425a63d.tar.bz2
plan9port-bc7cb1a15a67c859c8c71c4b52bb35fe9425a63d.zip
new utilities.
the .C files compile but are renamed to avoid building automatically.
Diffstat (limited to 'src/cmd/factor.c')
-rw-r--r--src/cmd/factor.c96
1 files changed, 96 insertions, 0 deletions
diff --git a/src/cmd/factor.c b/src/cmd/factor.c
new file mode 100644
index 00000000..0232d4e5
--- /dev/null
+++ b/src/cmd/factor.c
@@ -0,0 +1,96 @@
+#include <u.h>
+#include <libc.h>
+#include <bio.h>
+
+#define whsiz (sizeof(wheel)/sizeof(wheel[0]))
+
+double wheel[] =
+{
+ 2,10, 2, 4, 2, 4, 6, 2, 6, 4,
+ 2, 4, 6, 6, 2, 6, 4, 2, 6, 4,
+ 6, 8, 4, 2, 4, 2, 4, 8, 6, 4,
+ 6, 2, 4, 6, 2, 6, 6, 4, 2, 4,
+ 6, 2, 6, 4, 2, 4, 2,10,
+};
+
+Biobuf bin;
+
+void factor(double);
+
+void
+main(int argc, char *argv[])
+{
+ double n;
+ int i;
+ char *l;
+
+ if(argc > 1) {
+ for(i=1; i<argc; i++) {
+ n = atof(argv[i]);
+ factor(n);
+ }
+ exits(0);
+ }
+
+ Binit(&bin, 0, OREAD);
+ for(;;) {
+ l = Brdline(&bin, '\n');
+ if(l == 0)
+ break;
+ n = atof(l);
+ if(n <= 0)
+ break;
+ factor(n);
+ }
+ exits(0);
+}
+
+void
+factor(double n)
+{
+ double quot, d, s;
+ int i;
+
+ print("%.0f\n", n);
+ if(n == 0)
+ return;
+ s = sqrt(n) + 1;
+ while(modf(n/2, &quot) == 0) {
+ print(" 2\n");
+ n = quot;
+ s = sqrt(n) + 1;
+ }
+ while(modf(n/3, &quot) == 0) {
+ print(" 3\n");
+ n = quot;
+ s = sqrt(n) + 1;
+ }
+ while(modf(n/5, &quot) == 0) {
+ print(" 5\n");
+ n = quot;
+ s = sqrt(n) + 1;
+ }
+ while(modf(n/7, &quot) == 0) {
+ print(" 7\n");
+ n = quot;
+ s = sqrt(n) + 1;
+ }
+ d = 1;
+ for(i=1;;) {
+ d += wheel[i];
+ while(modf(n/d, &quot) == 0) {
+ print(" %.0f\n", d);
+ n = quot;
+ s = sqrt(n) + 1;
+ }
+ i++;
+ if(i >= whsiz) {
+ i = 0;
+ if(d > s)
+ break;
+ }
+ }
+ if(n > 1)
+ print(" %.0f\n",n);
+ print("\n");
+}