This notebook was prepared by [Thunder Shiviah](https://github.com/ThunderShiviah). Source and license info is on [GitHub](https://github.com/ThunderShiviah/code_guild).

Challenge Notebook

Problem: Implement list_primes(n), which returns a list of primes up to n (inclusive).

Constraints

  • Does list_primes do anything else?
    • No

Test Cases

  • list_primes(1) -> [] # 1 is not prime.
  • list_primes(2) -> [2]
  • list_primes(12) -> [2, 3, 5, 7 , 11]

Algorithm

Primes are numbers which are only divisible by 1 and themselves.

5 is a prime since it can only be divided by itself and 1. 9 is not a prime since it can be divided by 3 (3*3 = 9). 1 is not a prime for reasons that only mathematicians care about.

To check if a number is prime, we can implement a basic algorithm, namely: check if a given number can be divided by any numbers smaller than the given number (note: you really only need to test numbers up to the square root of a given number, but it doesn't really matter for this assignment).

Code


In [29]:
def list_primes(n):
    lst = []
    for num in range(2, n + 1):
        for number in range(2, num):
            if num % number == 0:
                break
        else:
            lst.append(num)


    return lst
list_primes(100000)


Out[29]:
[2,
 3,
 5,
 7,
 11,
 13,
 17,
 19,
 23,
 29,
 31,
 37,
 41,
 43,
 47,
 53,
 59,
 61,
 67,
 71,
 73,
 79,
 83,
 89,
 97,
 101,
 103,
 107,
 109,
 113,
 127,
 131,
 137,
 139,
 149,
 151,
 157,
 163,
 167,
 173,
 179,
 181,
 191,
 193,
 197,
 199,
 211,
 223,
 227,
 229,
 233,
 239,
 241,
 251,
 257,
 263,
 269,
 271,
 277,
 281,
 283,
 293,
 307,
 311,
 313,
 317,
 331,
 337,
 347,
 349,
 353,
 359,
 367,
 373,
 379,
 383,
 389,
 397,
 401,
 409,
 419,
 421,
 431,
 433,
 439,
 443,
 449,
 457,
 461,
 463,
 467,
 479,
 487,
 491,
 499,
 503,
 509,
 521,
 523,
 541,
 547,
 557,
 563,
 569,
 571,
 577,
 587,
 593,
 599,
 601,
 607,
 613,
 617,
 619,
 631,
 641,
 643,
 647,
 653,
 659,
 661,
 673,
 677,
 683,
 691,
 701,
 709,
 719,
 727,
 733,
 739,
 743,
 751,
 757,
 761,
 769,
 773,
 787,
 797,
 809,
 811,
 821,
 823,
 827,
 829,
 839,
 853,
 857,
 859,
 863,
 877,
 881,
 883,
 887,
 907,
 911,
 919,
 929,
 937,
 941,
 947,
 953,
 967,
 971,
 977,
 983,
 991,
 997,
 1009,
 1013,
 1019,
 1021,
 1031,
 1033,
 1039,
 1049,
 1051,
 1061,
 1063,
 1069,
 1087,
 1091,
 1093,
 1097,
 1103,
 1109,
 1117,
 1123,
 1129,
 1151,
 1153,
 1163,
 1171,
 1181,
 1187,
 1193,
 1201,
 1213,
 1217,
 1223,
 1229,
 1231,
 1237,
 1249,
 1259,
 1277,
 1279,
 1283,
 1289,
 1291,
 1297,
 1301,
 1303,
 1307,
 1319,
 1321,
 1327,
 1361,
 1367,
 1373,
 1381,
 1399,
 1409,
 1423,
 1427,
 1429,
 1433,
 1439,
 1447,
 1451,
 1453,
 1459,
 1471,
 1481,
 1483,
 1487,
 1489,
 1493,
 1499,
 1511,
 1523,
 1531,
 1543,
 1549,
 1553,
 1559,
 1567,
 1571,
 1579,
 1583,
 1597,
 1601,
 1607,
 1609,
 1613,
 1619,
 1621,
 1627,
 1637,
 1657,
 1663,
 1667,
 1669,
 1693,
 1697,
 1699,
 1709,
 1721,
 1723,
 1733,
 1741,
 1747,
 1753,
 1759,
 1777,
 1783,
 1787,
 1789,
 1801,
 1811,
 1823,
 1831,
 1847,
 1861,
 1867,
 1871,
 1873,
 1877,
 1879,
 1889,
 1901,
 1907,
 1913,
 1931,
 1933,
 1949,
 1951,
 1973,
 1979,
 1987,
 1993,
 1997,
 1999,
 2003,
 2011,
 2017,
 2027,
 2029,
 2039,
 2053,
 2063,
 2069,
 2081,
 2083,
 2087,
 2089,
 2099,
 2111,
 2113,
 2129,
 2131,
 2137,
 2141,
 2143,
 2153,
 2161,
 2179,
 2203,
 2207,
 2213,
 2221,
 2237,
 2239,
 2243,
 2251,
 2267,
 2269,
 2273,
 2281,
 2287,
 2293,
 2297,
 2309,
 2311,
 2333,
 2339,
 2341,
 2347,
 2351,
 2357,
 2371,
 2377,
 2381,
 2383,
 2389,
 2393,
 2399,
 2411,
 2417,
 2423,
 2437,
 2441,
 2447,
 2459,
 2467,
 2473,
 2477,
 2503,
 2521,
 2531,
 2539,
 2543,
 2549,
 2551,
 2557,
 2579,
 2591,
 2593,
 2609,
 2617,
 2621,
 2633,
 2647,
 2657,
 2659,
 2663,
 2671,
 2677,
 2683,
 2687,
 2689,
 2693,
 2699,
 2707,
 2711,
 2713,
 2719,
 2729,
 2731,
 2741,
 2749,
 2753,
 2767,
 2777,
 2789,
 2791,
 2797,
 2801,
 2803,
 2819,
 2833,
 2837,
 2843,
 2851,
 2857,
 2861,
 2879,
 2887,
 2897,
 2903,
 2909,
 2917,
 2927,
 2939,
 2953,
 2957,
 2963,
 2969,
 2971,
 2999,
 3001,
 3011,
 3019,
 3023,
 3037,
 3041,
 3049,
 3061,
 3067,
 3079,
 3083,
 3089,
 3109,
 3119,
 3121,
 3137,
 3163,
 3167,
 3169,
 3181,
 3187,
 3191,
 3203,
 3209,
 3217,
 3221,
 3229,
 3251,
 3253,
 3257,
 3259,
 3271,
 3299,
 3301,
 3307,
 3313,
 3319,
 3323,
 3329,
 3331,
 3343,
 3347,
 3359,
 3361,
 3371,
 3373,
 3389,
 3391,
 3407,
 3413,
 3433,
 3449,
 3457,
 3461,
 3463,
 3467,
 3469,
 3491,
 3499,
 3511,
 3517,
 3527,
 3529,
 3533,
 3539,
 3541,
 3547,
 3557,
 3559,
 3571,
 3581,
 3583,
 3593,
 3607,
 3613,
 3617,
 3623,
 3631,
 3637,
 3643,
 3659,
 3671,
 3673,
 3677,
 3691,
 3697,
 3701,
 3709,
 3719,
 3727,
 3733,
 3739,
 3761,
 3767,
 3769,
 3779,
 3793,
 3797,
 3803,
 3821,
 3823,
 3833,
 3847,
 3851,
 3853,
 3863,
 3877,
 3881,
 3889,
 3907,
 3911,
 3917,
 3919,
 3923,
 3929,
 3931,
 3943,
 3947,
 3967,
 3989,
 4001,
 4003,
 4007,
 4013,
 4019,
 4021,
 4027,
 4049,
 4051,
 4057,
 4073,
 4079,
 4091,
 4093,
 4099,
 4111,
 4127,
 4129,
 4133,
 4139,
 4153,
 4157,
 4159,
 4177,
 4201,
 4211,
 4217,
 4219,
 4229,
 4231,
 4241,
 4243,
 4253,
 4259,
 4261,
 4271,
 4273,
 4283,
 4289,
 4297,
 4327,
 4337,
 4339,
 4349,
 4357,
 4363,
 4373,
 4391,
 4397,
 4409,
 4421,
 4423,
 4441,
 4447,
 4451,
 4457,
 4463,
 4481,
 4483,
 4493,
 4507,
 4513,
 4517,
 4519,
 4523,
 4547,
 4549,
 4561,
 4567,
 4583,
 4591,
 4597,
 4603,
 4621,
 4637,
 4639,
 4643,
 4649,
 4651,
 4657,
 4663,
 4673,
 4679,
 4691,
 4703,
 4721,
 4723,
 4729,
 4733,
 4751,
 4759,
 4783,
 4787,
 4789,
 4793,
 4799,
 4801,
 4813,
 4817,
 4831,
 4861,
 4871,
 4877,
 4889,
 4903,
 4909,
 4919,
 4931,
 4933,
 4937,
 4943,
 4951,
 4957,
 4967,
 4969,
 4973,
 4987,
 4993,
 4999,
 5003,
 5009,
 5011,
 5021,
 5023,
 5039,
 5051,
 5059,
 5077,
 5081,
 5087,
 5099,
 5101,
 5107,
 5113,
 5119,
 5147,
 5153,
 5167,
 5171,
 5179,
 5189,
 5197,
 5209,
 5227,
 5231,
 5233,
 5237,
 5261,
 5273,
 5279,
 5281,
 5297,
 5303,
 5309,
 5323,
 5333,
 5347,
 5351,
 5381,
 5387,
 5393,
 5399,
 5407,
 5413,
 5417,
 5419,
 5431,
 5437,
 5441,
 5443,
 5449,
 5471,
 5477,
 5479,
 5483,
 5501,
 5503,
 5507,
 5519,
 5521,
 5527,
 5531,
 5557,
 5563,
 5569,
 5573,
 5581,
 5591,
 5623,
 5639,
 5641,
 5647,
 5651,
 5653,
 5657,
 5659,
 5669,
 5683,
 5689,
 5693,
 5701,
 5711,
 5717,
 5737,
 5741,
 5743,
 5749,
 5779,
 5783,
 5791,
 5801,
 5807,
 5813,
 5821,
 5827,
 5839,
 5843,
 5849,
 5851,
 5857,
 5861,
 5867,
 5869,
 5879,
 5881,
 5897,
 5903,
 5923,
 5927,
 5939,
 5953,
 5981,
 5987,
 6007,
 6011,
 6029,
 6037,
 6043,
 6047,
 6053,
 6067,
 6073,
 6079,
 6089,
 6091,
 6101,
 6113,
 6121,
 6131,
 6133,
 6143,
 6151,
 6163,
 6173,
 6197,
 6199,
 6203,
 6211,
 6217,
 6221,
 6229,
 6247,
 6257,
 6263,
 6269,
 6271,
 6277,
 6287,
 6299,
 6301,
 6311,
 6317,
 6323,
 6329,
 6337,
 6343,
 6353,
 6359,
 6361,
 6367,
 6373,
 6379,
 6389,
 6397,
 6421,
 6427,
 6449,
 6451,
 6469,
 6473,
 6481,
 6491,
 6521,
 6529,
 6547,
 6551,
 6553,
 6563,
 6569,
 6571,
 6577,
 6581,
 6599,
 6607,
 6619,
 6637,
 6653,
 6659,
 6661,
 6673,
 6679,
 6689,
 6691,
 6701,
 6703,
 6709,
 6719,
 6733,
 6737,
 6761,
 6763,
 6779,
 6781,
 6791,
 6793,
 6803,
 6823,
 6827,
 6829,
 6833,
 6841,
 6857,
 6863,
 6869,
 6871,
 6883,
 6899,
 6907,
 6911,
 6917,
 6947,
 6949,
 6959,
 6961,
 6967,
 6971,
 6977,
 6983,
 6991,
 6997,
 7001,
 7013,
 7019,
 7027,
 7039,
 7043,
 7057,
 7069,
 7079,
 7103,
 7109,
 7121,
 7127,
 7129,
 7151,
 7159,
 7177,
 7187,
 7193,
 7207,
 7211,
 7213,
 7219,
 7229,
 7237,
 7243,
 7247,
 7253,
 7283,
 7297,
 7307,
 7309,
 7321,
 7331,
 7333,
 7349,
 7351,
 7369,
 7393,
 7411,
 7417,
 7433,
 7451,
 7457,
 7459,
 7477,
 7481,
 7487,
 7489,
 7499,
 7507,
 7517,
 7523,
 7529,
 7537,
 7541,
 7547,
 7549,
 7559,
 7561,
 7573,
 7577,
 7583,
 7589,
 7591,
 7603,
 7607,
 7621,
 7639,
 7643,
 7649,
 7669,
 7673,
 7681,
 7687,
 7691,
 7699,
 7703,
 7717,
 7723,
 7727,
 7741,
 7753,
 7757,
 7759,
 7789,
 7793,
 7817,
 7823,
 7829,
 7841,
 7853,
 7867,
 7873,
 7877,
 7879,
 7883,
 7901,
 7907,
 7919,
 ...]

Unit Test

The following unit test is expected to fail until you solve the challenge.


In [3]:
# %load test_list_primes.py
from nose.tools import assert_equal


class Test_list_primes(object):

    def test_list_primes(self):
        assert_equal(list_primes(1), [])
        assert_equal(list_primes(2), [2])
        assert_equal(list_primes(7), [2, 3, 5, 7])
        assert_equal(list_primes(9), list_primes(7))
        print('Success: test_list_primes')


def main():
    test = Test_list_primes()
    test.test_list_primes()


if __name__ == '__main__':
    main()


---------------------------------------------------------------------------
AssertionError                            Traceback (most recent call last)
<ipython-input-3-daa21d192bd5> in <module>()
     19 
     20 if __name__ == '__main__':
---> 21     main()

<ipython-input-3-daa21d192bd5> in main()
     15 def main():
     16     test = Test_list_primes()
---> 17     test.test_list_primes()
     18 
     19 

<ipython-input-3-daa21d192bd5> in test_list_primes(self)
      6 
      7     def test_list_primes(self):
----> 8         assert_equal(list_primes(1), [])
      9         assert_equal(list_primes(2), [2])
     10         assert_equal(list_primes(7), [2, 3, 5, 7])

/home/thunder/anaconda3/lib/python3.5/unittest/case.py in assertEqual(self, first, second, msg)
    815         """
    816         assertion_func = self._getAssertEqualityFunc(first, second)
--> 817         assertion_func(first, second, msg=msg)
    818 
    819     def assertNotEqual(self, first, second, msg=None):

/home/thunder/anaconda3/lib/python3.5/unittest/case.py in _baseAssertEqual(self, first, second, msg)
    808             standardMsg = '%s != %s' % _common_shorten_repr(first, second)
    809             msg = self._formatMessage(msg, standardMsg)
--> 810             raise self.failureException(msg)
    811 
    812     def assertEqual(self, first, second, msg=None):

AssertionError: None != []

Solution Notebook

Review the Solution Notebook for a discussion on algorithms and code solutions.


In [ ]: