{"id":1068,"date":"2014-07-27T18:57:02","date_gmt":"2014-07-28T01:57:02","guid":{"rendered":"https:\/\/dubinko.info\/blog\/?p=1068"},"modified":"2014-07-27T18:57:02","modified_gmt":"2014-07-28T01:57:02","slug":"prime-number-sieve-in-scala","status":"publish","type":"post","link":"https:\/\/dubinko.info\/blog\/2014\/07\/prime-number-sieve-in-scala\/","title":{"rendered":"Prime Number sieve in Scala"},"content":{"rendered":"<p>There are a number of sieve algorithms that can be used to list\u00c2\u00a0prime numbers up to a certain value. \u00c2\u00a0I came up with this implementation\u00c2\u00a0in Scala. I rather like it, as it makes no use of division, modulus, and only one (explicit) multiplication.<\/p>\n<p>Despite being in Scala, it&#8217;s not in a functional style. It uses the awesome\u00c2\u00a0mutable BitSet data structure which is very efficient in space and time. It is intrinsically ordered and it allows an iterator, which makes jumping to the next known prime easy. Constructing a BitSet from a for comprehension is also easy with breakOut.<\/p>\n<p>The basic approach is the start with a large BitSet filled will all odd numbers (and 2), then iterate through the BitSet, constructing a new BitSet containing numbers to be crossed off, which is easily done with the &amp;~= (and-not) reassignment method. Since this is a logical bitwise operation, it&#8217;s blazing fast. This code takes longer to compile than run\u00c2\u00a0on my oldish MacBook Air.<\/p>\n<pre>\r\nimport scala.collection.mutable.BitSet\r\nimport scala.collection.breakOut<\/pre>\n<pre>println(new java.util.Date())\r\nval top = 200000<\/pre>\n<pre>val sieve = BitSet(2)\r\nsieve |= (3 to top by 2).map(identity)(breakOut)<\/pre>\n<pre>val iter = sieve.iteratorFrom(3)\r\nwhile(iter.hasNext) {\r\n val n = iter.next\r\n sieve &amp;~= (2*n to top by n).map(identity)(breakOut)\r\n}<\/pre>\n<pre>println(sieve.toIndexedSeq(10000)) \/\/ 0-based\r\nprintln(new java.util.Date())<\/pre>\n<p>As written here, it&#8217;s a solution to <a href=\"https:\/\/projecteuler.net\/problem=7\">Euler #7<\/a>, but it could be made even faster for more general use.<\/p>\n<p>For example<\/p>\n<ul>\n<li>I used a hard-coded top value (which is fine when you need to locate all primes up to \u00c2\u00a0<em>n<\/em>). For finding the <em>n<\/em>th prime, though, the top limit could <a href=\"http:\/\/en.wikipedia.org\/wiki\/Prime-counting_function\">be calculated<\/a><\/li>\n<li>I could stop iterating at sqrt(top)<\/li>\n<li>I could construct the removal BitSet\u00c2\u00a0starting\u00c2\u00a0at n*n rather than n*2<\/li>\n<\/ul>\n<p>I suspect that spending some time in the profiler could make this even faster. So take this as an example of the power of Scala, and a reminder that sometimes a non-FP solution can be valid too. Does anyone have a FP equivalent to this that doesn&#8217;t make my head hurt? :-)<\/p>\n<p>-m<\/p>\n","protected":false},"excerpt":{"rendered":"<p>There are a number of sieve algorithms that can be used to list\u00c2\u00a0prime numbers up to a certain value. \u00c2\u00a0I came up with this implementation\u00c2\u00a0in Scala. I rather like it, as it makes no use of division, modulus, and only one (explicit) multiplication. Despite being in Scala, it&#8217;s not in a functional style. It uses&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"jetpack_post_was_ever_published":false},"categories":[27,22],"tags":[1143,1177,248,1141,1140,1142],"class_list":["post-1068","post","type-post","status-publish","format-standard","hentry","category-languages","category-software","tag-bitset","tag-math","tag-optimization","tag-prime","tag-scala","tag-sieve"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"There are a number of sieve algorithms that can be used to list\u00c2 prime numbers up to a certain value. \u00c2 I came up with this implementation\u00c2 in Scala. I rather like it, as it makes no use of division, modulus, and only one (explicit) multiplication. Despite being in Scala, it&#039;s not in a functional style. It uses\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"mdubinko\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/dubinko.info\/blog\/2014\/07\/prime-number-sieve-in-scala\/\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"en_US\" \/>\n\t\t<meta property=\"og:site_name\" content=\"MicahLogic Queryopticon | Yields undecidable when preceded by its quotation\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"Prime Number sieve in Scala | MicahLogic Queryopticon\" \/>\n\t\t<meta property=\"og:description\" content=\"There are a number of sieve algorithms that can be used to list\u00c2 prime numbers up to a certain value. \u00c2 I came up with this implementation\u00c2 in Scala. I rather like it, as it makes no use of division, modulus, and only one (explicit) multiplication. Despite being in Scala, it&#039;s not in a functional style. It uses\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/dubinko.info\/blog\/2014\/07\/prime-number-sieve-in-scala\/\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2014-07-28T01:57:02+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2014-07-28T01:57:02+00:00\" \/>\n\t\t<meta name=\"twitter:card\" content=\"summary\" \/>\n\t\t<meta name=\"twitter:title\" content=\"Prime Number sieve in Scala | MicahLogic Queryopticon\" \/>\n\t\t<meta name=\"twitter:description\" content=\"There are a number of sieve algorithms that can be used to list\u00c2 prime numbers up to a certain value. \u00c2 I came up with this implementation\u00c2 in Scala. I rather like it, as it makes no use of division, modulus, and only one (explicit) multiplication. Despite being in Scala, it&#039;s not in a functional style. It uses\" \/>\n\t\t<script type=\"application\/ld+json\" class=\"aioseo-schema\">\n\t\t\t{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/dubinko.info\\\/blog\\\/2014\\\/07\\\/prime-number-sieve-in-scala\\\/#article\",\"name\":\"Prime Number sieve in Scala | MicahLogic Queryopticon\",\"headline\":\"Prime Number sieve in Scala\",\"author\":{\"@id\":\"https:\\\/\\\/dubinko.info\\\/blog\\\/author\\\/admin\\\/#author\"},\"publisher\":{\"@id\":\"https:\\\/\\\/dubinko.info\\\/blog\\\/#organization\"},\"datePublished\":\"2014-07-27T18:57:02-07:00\",\"dateModified\":\"2014-07-27T18:57:02-07:00\",\"inLanguage\":\"en-US\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/dubinko.info\\\/blog\\\/2014\\\/07\\\/prime-number-sieve-in-scala\\\/#webpage\"},\"isPartOf\":{\"@id\":\"https:\\\/\\\/dubinko.info\\\/blog\\\/2014\\\/07\\\/prime-number-sieve-in-scala\\\/#webpage\"},\"articleSection\":\"languages, software, bitset, math, optimization, prime, scala, sieve\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/dubinko.info\\\/blog\\\/2014\\\/07\\\/prime-number-sieve-in-scala\\\/#breadcrumblist\",\"itemListElement\":[{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/dubinko.info\\\/blog#listItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/dubinko.info\\\/blog\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/dubinko.info\\\/blog\\\/tags\\\/software\\\/#listItem\",\"name\":\"software\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/dubinko.info\\\/blog\\\/tags\\\/software\\\/#listItem\",\"position\":2,\"name\":\"software\",\"item\":\"https:\\\/\\\/dubinko.info\\\/blog\\\/tags\\\/software\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/dubinko.info\\\/blog\\\/2014\\\/07\\\/prime-number-sieve-in-scala\\\/#listItem\",\"name\":\"Prime Number sieve in Scala\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/dubinko.info\\\/blog#listItem\",\"name\":\"Home\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/dubinko.info\\\/blog\\\/2014\\\/07\\\/prime-number-sieve-in-scala\\\/#listItem\",\"position\":3,\"name\":\"Prime Number sieve in Scala\",\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/dubinko.info\\\/blog\\\/tags\\\/software\\\/#listItem\",\"name\":\"software\"}}]},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/dubinko.info\\\/blog\\\/#organization\",\"name\":\"MicahLogic Queryopticon\",\"description\":\"Yields undecidable when preceded by its quotation\",\"url\":\"https:\\\/\\\/dubinko.info\\\/blog\\\/\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/dubinko.info\\\/blog\\\/author\\\/admin\\\/#author\",\"url\":\"https:\\\/\\\/dubinko.info\\\/blog\\\/author\\\/admin\\\/\",\"name\":\"mdubinko\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https:\\\/\\\/dubinko.info\\\/blog\\\/2014\\\/07\\\/prime-number-sieve-in-scala\\\/#authorImage\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/c1160c0ab9ce581a55013f96fd61356e166ffc9a00666a5062bc8121922fcdcd?s=96&d=retro&r=g\",\"width\":96,\"height\":96,\"caption\":\"mdubinko\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/dubinko.info\\\/blog\\\/2014\\\/07\\\/prime-number-sieve-in-scala\\\/#webpage\",\"url\":\"https:\\\/\\\/dubinko.info\\\/blog\\\/2014\\\/07\\\/prime-number-sieve-in-scala\\\/\",\"name\":\"Prime Number sieve in Scala | MicahLogic Queryopticon\",\"description\":\"There are a number of sieve algorithms that can be used to list\\u00c2 prime numbers up to a certain value. \\u00c2 I came up with this implementation\\u00c2 in Scala. I rather like it, as it makes no use of division, modulus, and only one (explicit) multiplication. Despite being in Scala, it's not in a functional style. It uses\",\"inLanguage\":\"en-US\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/dubinko.info\\\/blog\\\/#website\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/dubinko.info\\\/blog\\\/2014\\\/07\\\/prime-number-sieve-in-scala\\\/#breadcrumblist\"},\"author\":{\"@id\":\"https:\\\/\\\/dubinko.info\\\/blog\\\/author\\\/admin\\\/#author\"},\"creator\":{\"@id\":\"https:\\\/\\\/dubinko.info\\\/blog\\\/author\\\/admin\\\/#author\"},\"datePublished\":\"2014-07-27T18:57:02-07:00\",\"dateModified\":\"2014-07-27T18:57:02-07:00\"},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/dubinko.info\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/dubinko.info\\\/blog\\\/\",\"name\":\"MicahLogic Queryopticon\",\"description\":\"Yields undecidable when preceded by its quotation\",\"inLanguage\":\"en-US\",\"publisher\":{\"@id\":\"https:\\\/\\\/dubinko.info\\\/blog\\\/#organization\"}}]}\n\t\t<\/script>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"Prime Number sieve in Scala | MicahLogic Queryopticon","description":"There are a number of sieve algorithms that can be used to list\u00c2 prime numbers up to a certain value. \u00c2 I came up with this implementation\u00c2 in Scala. I rather like it, as it makes no use of division, modulus, and only one (explicit) multiplication. Despite being in Scala, it's not in a functional style. It uses","canonical_url":"https:\/\/dubinko.info\/blog\/2014\/07\/prime-number-sieve-in-scala\/","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/dubinko.info\/blog\/2014\/07\/prime-number-sieve-in-scala\/#article","name":"Prime Number sieve in Scala | MicahLogic Queryopticon","headline":"Prime Number sieve in Scala","author":{"@id":"https:\/\/dubinko.info\/blog\/author\/admin\/#author"},"publisher":{"@id":"https:\/\/dubinko.info\/blog\/#organization"},"datePublished":"2014-07-27T18:57:02-07:00","dateModified":"2014-07-27T18:57:02-07:00","inLanguage":"en-US","mainEntityOfPage":{"@id":"https:\/\/dubinko.info\/blog\/2014\/07\/prime-number-sieve-in-scala\/#webpage"},"isPartOf":{"@id":"https:\/\/dubinko.info\/blog\/2014\/07\/prime-number-sieve-in-scala\/#webpage"},"articleSection":"languages, software, bitset, math, optimization, prime, scala, sieve"},{"@type":"BreadcrumbList","@id":"https:\/\/dubinko.info\/blog\/2014\/07\/prime-number-sieve-in-scala\/#breadcrumblist","itemListElement":[{"@type":"ListItem","@id":"https:\/\/dubinko.info\/blog#listItem","position":1,"name":"Home","item":"https:\/\/dubinko.info\/blog","nextItem":{"@type":"ListItem","@id":"https:\/\/dubinko.info\/blog\/tags\/software\/#listItem","name":"software"}},{"@type":"ListItem","@id":"https:\/\/dubinko.info\/blog\/tags\/software\/#listItem","position":2,"name":"software","item":"https:\/\/dubinko.info\/blog\/tags\/software\/","nextItem":{"@type":"ListItem","@id":"https:\/\/dubinko.info\/blog\/2014\/07\/prime-number-sieve-in-scala\/#listItem","name":"Prime Number sieve in Scala"},"previousItem":{"@type":"ListItem","@id":"https:\/\/dubinko.info\/blog#listItem","name":"Home"}},{"@type":"ListItem","@id":"https:\/\/dubinko.info\/blog\/2014\/07\/prime-number-sieve-in-scala\/#listItem","position":3,"name":"Prime Number sieve in Scala","previousItem":{"@type":"ListItem","@id":"https:\/\/dubinko.info\/blog\/tags\/software\/#listItem","name":"software"}}]},{"@type":"Organization","@id":"https:\/\/dubinko.info\/blog\/#organization","name":"MicahLogic Queryopticon","description":"Yields undecidable when preceded by its quotation","url":"https:\/\/dubinko.info\/blog\/"},{"@type":"Person","@id":"https:\/\/dubinko.info\/blog\/author\/admin\/#author","url":"https:\/\/dubinko.info\/blog\/author\/admin\/","name":"mdubinko","image":{"@type":"ImageObject","@id":"https:\/\/dubinko.info\/blog\/2014\/07\/prime-number-sieve-in-scala\/#authorImage","url":"https:\/\/secure.gravatar.com\/avatar\/c1160c0ab9ce581a55013f96fd61356e166ffc9a00666a5062bc8121922fcdcd?s=96&d=retro&r=g","width":96,"height":96,"caption":"mdubinko"}},{"@type":"WebPage","@id":"https:\/\/dubinko.info\/blog\/2014\/07\/prime-number-sieve-in-scala\/#webpage","url":"https:\/\/dubinko.info\/blog\/2014\/07\/prime-number-sieve-in-scala\/","name":"Prime Number sieve in Scala | MicahLogic Queryopticon","description":"There are a number of sieve algorithms that can be used to list\u00c2 prime numbers up to a certain value. \u00c2 I came up with this implementation\u00c2 in Scala. I rather like it, as it makes no use of division, modulus, and only one (explicit) multiplication. Despite being in Scala, it's not in a functional style. It uses","inLanguage":"en-US","isPartOf":{"@id":"https:\/\/dubinko.info\/blog\/#website"},"breadcrumb":{"@id":"https:\/\/dubinko.info\/blog\/2014\/07\/prime-number-sieve-in-scala\/#breadcrumblist"},"author":{"@id":"https:\/\/dubinko.info\/blog\/author\/admin\/#author"},"creator":{"@id":"https:\/\/dubinko.info\/blog\/author\/admin\/#author"},"datePublished":"2014-07-27T18:57:02-07:00","dateModified":"2014-07-27T18:57:02-07:00"},{"@type":"WebSite","@id":"https:\/\/dubinko.info\/blog\/#website","url":"https:\/\/dubinko.info\/blog\/","name":"MicahLogic Queryopticon","description":"Yields undecidable when preceded by its quotation","inLanguage":"en-US","publisher":{"@id":"https:\/\/dubinko.info\/blog\/#organization"}}]},"og:locale":"en_US","og:site_name":"MicahLogic Queryopticon | Yields undecidable when preceded by its quotation","og:type":"article","og:title":"Prime Number sieve in Scala | MicahLogic Queryopticon","og:description":"There are a number of sieve algorithms that can be used to list\u00c2 prime numbers up to a certain value. \u00c2 I came up with this implementation\u00c2 in Scala. I rather like it, as it makes no use of division, modulus, and only one (explicit) multiplication. Despite being in Scala, it's not in a functional style. It uses","og:url":"https:\/\/dubinko.info\/blog\/2014\/07\/prime-number-sieve-in-scala\/","article:published_time":"2014-07-28T01:57:02+00:00","article:modified_time":"2014-07-28T01:57:02+00:00","twitter:card":"summary","twitter:title":"Prime Number sieve in Scala | MicahLogic Queryopticon","twitter:description":"There are a number of sieve algorithms that can be used to list\u00c2 prime numbers up to a certain value. \u00c2 I came up with this implementation\u00c2 in Scala. I rather like it, as it makes no use of division, modulus, and only one (explicit) multiplication. Despite being in Scala, it's not in a functional style. It uses"},"aioseo_meta_data":{"post_id":"1068","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"breadcrumb_settings":null,"limit_modified_date":false,"ai":null,"created":"2021-02-04 08:01:54","updated":"2025-12-10 03:45:38","seo_analyzer_scan_date":null,"focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"aioseo_breadcrumb":"<div class=\"aioseo-breadcrumbs\"><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/dubinko.info\/blog\" title=\"Home\">Home<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/dubinko.info\/blog\/tags\/software\/\" title=\"software\">software<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\tPrime Number sieve in Scala\n\t\t<\/span><\/div>","aioseo_breadcrumb_json":[{"label":"Home","link":"https:\/\/dubinko.info\/blog"},{"label":"software","link":"https:\/\/dubinko.info\/blog\/tags\/software\/"},{"label":"Prime Number sieve in Scala","link":"https:\/\/dubinko.info\/blog\/2014\/07\/prime-number-sieve-in-scala\/"}],"jetpack_publicize_connections":[],"jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p8eo8l-he","jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/dubinko.info\/blog\/wp-json\/wp\/v2\/posts\/1068","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/dubinko.info\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/dubinko.info\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/dubinko.info\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/dubinko.info\/blog\/wp-json\/wp\/v2\/comments?post=1068"}],"version-history":[{"count":1,"href":"https:\/\/dubinko.info\/blog\/wp-json\/wp\/v2\/posts\/1068\/revisions"}],"predecessor-version":[{"id":1069,"href":"https:\/\/dubinko.info\/blog\/wp-json\/wp\/v2\/posts\/1068\/revisions\/1069"}],"wp:attachment":[{"href":"https:\/\/dubinko.info\/blog\/wp-json\/wp\/v2\/media?parent=1068"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dubinko.info\/blog\/wp-json\/wp\/v2\/categories?post=1068"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dubinko.info\/blog\/wp-json\/wp\/v2\/tags?post=1068"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}