1 /* $NetBSD: factor.c,v 1.11 2000/12/22 10:12:12 mrg Exp $ */
4 * Copyright 1997 Piermont Information Systems Inc.
7 * Written by Philip A. Nelson for Piermont Information Systems Inc.
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions
12 * 1. Redistributions of source code must retain the above copyright
13 * notice, this list of conditions and the following disclaimer.
14 * 2. Redistributions in binary form must reproduce the above copyright
15 * notice, this list of conditions and the following disclaimer in the
16 * documentation and/or other materials provided with the distribution.
17 * 3. All advertising materials mentioning features or use of this software
18 * must display the following acknowledgement:
19 * This product includes software developed for the NetBSD Project by
20 * Piermont Information Systems Inc.
21 * 4. The name of Piermont Information Systems Inc. may not be used to endorse
22 * or promote products derived from this software without specific prior
25 * THIS SOFTWARE IS PROVIDED BY PIERMONT INFORMATION SYSTEMS INC. ``AS IS''
26 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
27 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
28 * ARE DISCLAIMED. IN NO EVENT SHALL PIERMONT INFORMATION SYSTEMS INC. BE
29 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
30 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
31 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
32 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
33 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
34 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
35 * THE POSSIBILITY OF SUCH DAMAGE.
39 /* Prototypes for strict prototyping. */
41 #include <sys/cdefs.h>
47 * primes - prime table, built to include up to 46345 because
48 * sqrt(2^31) = 46340.9500118415
50 * building the table instead of storing a precomputed table saves
51 * about 19K of space on the binary image.
58 static void build_primes (long max
);
59 void factor (long val
, long *fact_list
, int fact_size
, int *num_fact
);
70 * Initialise primes at run-time rather than compile time
71 * so it's put in bss rather than data.
76 for (pc
= primes
[num_primes
-1]; pc
< 46345 && pc
*pc
<= max
; pc
+=2) {
79 while (j
< num_primes
&& primes
[j
] * primes
[j
] <= pc
) {
80 if ((rem
= pc
% primes
[j
]) == 0)
85 primes
[num_primes
++] = pc
;
89 /* factor: prepare a list of prime factors of val.
90 The last number may not be a prime factor is the list is not
94 factor(val
, fact_list
, fact_size
, num_fact
)
102 /* Check to make sure we have enough primes. */
107 while (*num_fact
< fact_size
-1 && val
> 1 && i
< num_primes
) {
108 /* Find the next prime that divides. */
109 while (i
< num_primes
&& val
% primes
[i
] != 0) i
++;
111 /* Put factors in array. */
112 while (*num_fact
< fact_size
-1 && i
< num_primes
&&
113 val
% primes
[i
] == 0) {
114 fact_list
[(*num_fact
)++] = primes
[i
];
119 fact_list
[(*num_fact
)++] = val
;
128 main(int argc
, char **argv
)
136 fprintf (stderr
, "usage: %s numbers\n", argv
[0]);
140 /* Factor each arg! */
141 for (arg
= 1; arg
< argc
; arg
++) {
143 val
= atol(argv
[arg
]);
144 factor (val
, facts
, 30, &nfact
);
146 printf ("%ld:", val
);
147 for (i
= 0; i
<nfact
; i
++)
148 printf (" %ld", facts
[i
]);