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