This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
haas:spring2016:cprog:projects:pnc0 [2016/02/22 18:59] – [Bonus Points] wedge | haas:spring2016:cprog:projects:pnc0 [2016/02/27 13:13] (current) – [Program] wedge | ||
---|---|---|---|
Line 17: | Line 17: | ||
* ability to iterate sections of code (for/while statement) | * ability to iterate sections of code (for/while statement) | ||
+ | =====Algorithmic Complexity===== | ||
+ | A concept in Computer Science curriculum is the notion of computational/ | ||
+ | |||
+ | Basically, a solution to a problem exists on a spectrum of efficiency (typically constrained by time vs. space): if optimizing for time, the code size tends to grow. | ||
+ | |||
+ | Additionally, | ||
+ | |||
+ | This project will endeavor to introduce you to the notion that the algorithms and constructs you use in coding your solution can and do make a difference to the overall runtime of your code. | ||
=====Background===== | =====Background===== | ||
In mathematics, | In mathematics, | ||
Line 109: | Line 117: | ||
One assumption I will allow you to make for your optimized solution is that the single-digit primes (2, 3, 5, 7) can be assumed prime, and just printed out if having them be calculated would otherwise break your algorithm (might be helpful to some people; I certainly found it useful in some of my solutions). | One assumption I will allow you to make for your optimized solution is that the single-digit primes (2, 3, 5, 7) can be assumed prime, and just printed out if having them be calculated would otherwise break your algorithm (might be helpful to some people; I certainly found it useful in some of my solutions). | ||
+ | |||
+ | ===some optimization ideas=== | ||
+ | * [[https:// | ||
+ | * [[https:// | ||
+ | * [[https:// | ||
+ | * [[https:// | ||
+ | * [[https:// | ||
+ | |||
+ | Of particular note: the sieve algorithms take advantage of a increased storage space, where others (like brute force) are predominantly time-based. The sieve is also more detailed... even if you don't decide to implement a sieve, take a look and compare the algorithm to what you've done to see the differences in approaches. | ||
=====Program===== | =====Program===== | ||
It is your task to write 3 separate prime number calculating programs: | It is your task to write 3 separate prime number calculating programs: | ||
- | - primebrute.c: | + | - **primebrute.c**: for your brute force implementation |
- | - primesqrt.c: | + | - **primesqrt.c**: for your square root-optimization of the brute force |
- | - primeopt.c: for your optimized solution, be it basing off the existing ones, or taking a different approach | + | - **primeopt.c**: for your optimized solution, be it basing off the existing ones, or taking a different approach |
Your program should: | Your program should: | ||
Line 122: | Line 139: | ||
* these values should be positive integer values; you can make the assumption that the user will always do the right thing. | * these values should be positive integer values; you can make the assumption that the user will always do the right thing. | ||
* start your stopwatch (see **timing** section below): | * start your stopwatch (see **timing** section below): | ||
- | * perform the correct | + | * perform the algorithm against the value |
* if enabled, display the prime numbers found in the range | * if enabled, display the prime numbers found in the range | ||
* output the processing run-time to STDERR (do this always). | * output the processing run-time to STDERR (do this always). | ||
Line 129: | Line 146: | ||
* the timing information will be displayed in accordance to code I will provide (in the **timing** section). | * the timing information will be displayed in accordance to code I will provide (in the **timing** section). | ||
+ | ====Other considerations==== | ||
+ | All your programs MUST perform the calculations to determine primality- you may not always be printing it out (depending on argv[2]), but work must be done to ensure the value is identified as a prime/ | ||
+ | |||
+ | For example: | ||
+ | |||
+ | < | ||
+ | if (show == 1) | ||
+ | { | ||
+ | work to determine if it is prime | ||
+ | if prime | ||
+ | print number | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | will actually skip the core processing, and you’ll see some amazing runtimes as a result. They may be amazing, but they’re not real, because you’re not actually doing anything. | ||
+ | |||
+ | What you want instead: | ||
+ | |||
+ | < | ||
+ | work to determine if it is prime | ||
+ | if (show == 1) | ||
+ | { | ||
+ | if prime | ||
+ | print number | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | there are many ways to express the above, through compound if statements and other arrangements, | ||
+ | |||
+ | That also isn’t to say you can’t avoid doing a work run if you’re able to determine its non-primality with a simple pretest (even value, factor of 3, etc.), but that’s actually considered more of the core “work”, so it is more than okay (and encouraged in the primeopt). | ||
=====Command-Line Arguments===== | =====Command-Line Arguments===== | ||
To automate our comparisons, | To automate our comparisons, | ||
Line 290: | Line 337: | ||
<cli> | <cli> | ||
- | lab46: | + | lab46: |
- | | + | |
============================================ | ============================================ | ||
- | | + | |
- | 16 0.000002 | + | ============================================ |
- | 32 0.000003 | + | 8 0.000002 |
- | 64 0.000005 | + | 16 0.000002 |
- | | + | 32 0.000003 |
- | | + | 64 0.000005 |
- | | + | |
- | 1024 0.000540 | + | |
- | 2048 0.001779 | + | |
- | 4096 0.006087 | + | 1024 0.000540 |
- | 8192 0.021272 | + | 2048 0.001761 |
- | | + | 4096 0.006115 |
- | | + | 8192 0.021259 |
- | | + | |
- | 131072 | + | |
- | 262144 | + | |
+ | 131072 | ||
+ | 262144 | ||
+ | 524288 | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | ============================================ | ||
+ | | ||
============================================ | ============================================ | ||
lab46: | lab46: | ||
</ | </ | ||
+ | For evaluation, each test is run 4 times, and the resulting time is averaged. During development, | ||
+ | |||
+ | If the runtime of a particular prime variant exceeds an upper threshold (likely to be set at 2 seconds), it will be omitted from further tests, and a series of dashes will instead appear in the output. | ||
+ | |||
+ | If you don't feel like waiting, simply hit **CTRL-c** and the script will terminate. | ||
+ | |||
+ | In the example output above, my **primeopt** is playing with an implementation of the **6a+/-1** algorithm. | ||
+ | |||
+ | I also include a validation check- to ensure your prime programs are actually producing the correct list of prime numbers. If the check is successful, you will see " | ||
+ | |||
+ | If you'd like to experiment with other variations, the script also recognizes prime variants of the following names: | ||
+ | * primeopt0 (for an additional optimization) | ||
+ | * primeopt1 (and another) | ||
+ | * primeopt2 (if you'd like another entry for another optimization) | ||
+ | * primeopt3 (for yet another optimization) | ||
+ | * primeopt4 (and one more; hey, I want you to have nice things) | ||
=====Bonus Points===== | =====Bonus Points===== | ||
There will be an additional bonus point opportunity with this project, based on processing run-time of your optimized solution. | There will be an additional bonus point opportunity with this project, based on processing run-time of your optimized solution. |