xref: /titanic_41/usr/src/lib/libshell/common/scripts/primenumbers1.sh (revision 3e14f97f673e8a630f076077de35afdd43dc1587)
17c2fbfb3SApril Chin#!/usr/bin/ksh93
27c2fbfb3SApril Chin
37c2fbfb3SApril Chin#
47c2fbfb3SApril Chin# CDDL HEADER START
57c2fbfb3SApril Chin#
67c2fbfb3SApril Chin# The contents of this file are subject to the terms of the
77c2fbfb3SApril Chin# Common Development and Distribution License (the "License").
87c2fbfb3SApril Chin# You may not use this file except in compliance with the License.
97c2fbfb3SApril Chin#
107c2fbfb3SApril Chin# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
117c2fbfb3SApril Chin# or http://www.opensolaris.org/os/licensing.
127c2fbfb3SApril Chin# See the License for the specific language governing permissions
137c2fbfb3SApril Chin# and limitations under the License.
147c2fbfb3SApril Chin#
157c2fbfb3SApril Chin# When distributing Covered Code, include this CDDL HEADER in each
167c2fbfb3SApril Chin# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
177c2fbfb3SApril Chin# If applicable, add the following below this CDDL HEADER, with the
187c2fbfb3SApril Chin# fields enclosed by brackets "[]" replaced with your own identifying
197c2fbfb3SApril Chin# information: Portions Copyright [yyyy] [name of copyright owner]
207c2fbfb3SApril Chin#
217c2fbfb3SApril Chin# CDDL HEADER END
227c2fbfb3SApril Chin#
237c2fbfb3SApril Chin
247c2fbfb3SApril Chin#
25*3e14f97fSRoger A. Faulkner# Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
267c2fbfb3SApril Chin#
277c2fbfb3SApril Chin
287c2fbfb3SApril Chin#
297c2fbfb3SApril Chin# primenumbers1 - a simple prime number generator
307c2fbfb3SApril Chin#
317c2fbfb3SApril Chin
327c2fbfb3SApril Chin# Solaris needs /usr/xpg6/bin:/usr/xpg4/bin because the tools in /usr/bin are not POSIX-conformant
337c2fbfb3SApril Chinexport PATH=/usr/xpg6/bin:/usr/xpg4/bin:/bin:/usr/bin
347c2fbfb3SApril Chin
357c2fbfb3SApril Chin# Make sure all math stuff runs in the "C" locale to avoid problems
367c2fbfb3SApril Chin# with alternative # radix point representations (e.g. ',' instead of
377c2fbfb3SApril Chin# '.' in de_DE.*-locales). This needs to be set _before_ any
387c2fbfb3SApril Chin# floating-point constants are defined in this script).
397c2fbfb3SApril Chinif [[ "${LC_ALL}" != "" ]] ; then
407c2fbfb3SApril Chin    export \
417c2fbfb3SApril Chin        LC_MONETARY="${LC_ALL}" \
427c2fbfb3SApril Chin        LC_MESSAGES="${LC_ALL}" \
437c2fbfb3SApril Chin        LC_COLLATE="${LC_ALL}" \
447c2fbfb3SApril Chin        LC_CTYPE="${LC_ALL}"
457c2fbfb3SApril Chin        unset LC_ALL
467c2fbfb3SApril Chinfi
477c2fbfb3SApril Chinexport LC_NUMERIC=C
487c2fbfb3SApril Chin
497c2fbfb3SApril Chin
507c2fbfb3SApril Chin# check whether arg1 is a prime number via comparing it against the "pn" array
517c2fbfb3SApril Chinfunction is_prime
527c2fbfb3SApril Chin{
537c2fbfb3SApril Chin	integer i
547c2fbfb3SApril Chin	integer num=$1
557c2fbfb3SApril Chin	float   max_pn
567c2fbfb3SApril Chin
577c2fbfb3SApril Chin	(( max_pn=sqrt(num)+1. ))
587c2fbfb3SApril Chin
597c2fbfb3SApril Chin	for (( i=0 ; i < num_pn && pn[i] < max_pn ; i++)) ; do
607c2fbfb3SApril Chin		(( num % pn[i] == 0 )) && return 1;
617c2fbfb3SApril Chin	done
627c2fbfb3SApril Chin	return 0
637c2fbfb3SApril Chin}
647c2fbfb3SApril Chin
657c2fbfb3SApril Chin# main
667c2fbfb3SApril Chinset -o errexit
677c2fbfb3SApril Chin
687c2fbfb3SApril Chin# get arguments
697c2fbfb3SApril Chininteger max_prime=$1 # maximum prime number
707c2fbfb3SApril Chintypeset outputformat=$2
717c2fbfb3SApril Chin
727c2fbfb3SApril Chin# variables
737c2fbfb3SApril Chininteger -a pn		# integer array for the prime numbers
747c2fbfb3SApril Chininteger num_pn=1	# number of prime numbers
757c2fbfb3SApril Chininteger n		# current number which should be tested
767c2fbfb3SApril Chinpn[0]=2			# start value
777c2fbfb3SApril Chin
787c2fbfb3SApril Chin# prechecks
797c2fbfb3SApril Chin(( max_prime > 1 )) || { print -u2 -f "%s: requires a positive integer as first input.\n" "$0" ; exit 1 ; }
807c2fbfb3SApril Chin
817c2fbfb3SApril Chin# calculate prime numbers
827c2fbfb3SApril Chinprintf $"# %s: Calculating prime numbes from 1 to %i\n" "${ date '+%T' ; }" max_prime 1>&2
837c2fbfb3SApril Chin
847c2fbfb3SApril Chinfor (( n=3 ; n < max_prime ; n+=2 )) ; do
857c2fbfb3SApril Chin	if is_prime $n ; then
867c2fbfb3SApril Chin		(( pn[num_pn++]=n ))
877c2fbfb3SApril Chin	fi
887c2fbfb3SApril Chindone
897c2fbfb3SApril Chin
907c2fbfb3SApril Chin# print results
917c2fbfb3SApril Chinprintf $"# %s: Calculation done, printing results:\n" "${ date '+%T' ; }" 1>&2
927c2fbfb3SApril Chin
937c2fbfb3SApril Chinfor (( n=0 ; n < num_pn ; n++ )) ; do
947c2fbfb3SApril Chin	# print prime number
957c2fbfb3SApril Chin	case ${outputformat} in
967c2fbfb3SApril Chin		block)
977c2fbfb3SApril Chin			printf $"%i$( (( n % 8 == 0 )) && print -r '\n' || print -r ',\t')" pn[n]
987c2fbfb3SApril Chin			;;
997c2fbfb3SApril Chin		line)
1007c2fbfb3SApril Chin			printf $"%i\n" pn[n]
1017c2fbfb3SApril Chin			;;
1027c2fbfb3SApril Chin		*)
1037c2fbfb3SApril Chin			printf $"prime %i:\t%i\n" n pn[n]
1047c2fbfb3SApril Chin			;;
1057c2fbfb3SApril Chin	esac
1067c2fbfb3SApril Chindone
1077c2fbfb3SApril Chin
1087c2fbfb3SApril Chinif [[ ${outputformat} == "block" ]] && (( n % 8 != 1 )); then
1097c2fbfb3SApril Chin	print
1107c2fbfb3SApril Chinfi
1117c2fbfb3SApril Chin
1127c2fbfb3SApril Chinprintf $"# %s: Done.\n" "${ date '+%T' ; }" 1>&2
1137c2fbfb3SApril Chin
1147c2fbfb3SApril Chin#EOF.
115