<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DZone Snippets: 10006 code</title>
    <link>http://snippets.dzone.com/posts</link>
    <pubDate>Sun, 12 Oct 2008 14:39:57 GMT</pubDate>
    <description>DZone Snippets: 10006 code</description>
    <item>
      <title>A solution for the "Carmichael Numbers" problem</title>
      <link>http://snippets.dzone.com/posts/show/5429</link>
      <description>A solution for the "Carmichael Numbers" problem.&lt;br /&gt;&lt;br /&gt;Problem description:&lt;br /&gt;&lt;a href="http://icpcres.ecs.baylor.edu/onlinejudge/external/100/10006.html"&gt;http://icpcres.ecs.baylor.edu/onlinejudge/external/100/10006.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Author: &lt;a href="http://joanatrindade.wikidot.com"&gt;Joana Matos Fonseca da Trindade&lt;/a&gt;&lt;br /&gt;Date: 2008.04.24&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;/* &lt;br /&gt; * Solution for "Carmichael Numbers" problem.&lt;br /&gt; * UVa ID: 10006&lt;br /&gt; */&lt;br /&gt;#include &lt;iostream&gt;&lt;br /&gt;#include &lt;math.h&gt;&lt;br /&gt;&lt;br /&gt;#define MAXPRIME 65001&lt;br /&gt;&lt;br /&gt;using namespace std;&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt; * Modular exponentiation algorithm. Returns b^e mod m.&lt;br /&gt; */&lt;br /&gt;unsigned long long fast_mod_pow(unsigned long long b, unsigned long long e, unsigned long long m) {&lt;br /&gt;    unsigned long long r = 1;&lt;br /&gt;    while (e &gt; 0) {&lt;br /&gt;        if ((e &amp; 1) == 1) {&lt;br /&gt;	    r = (r * b) % m;&lt;br /&gt;        }&lt;br /&gt;        e &gt;&gt;= 1;&lt;br /&gt;        b = (b * b) % m;&lt;br /&gt;    }&lt;br /&gt;    return r;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/* &lt;br /&gt; * Generates all prime numbers up to MAXPRIME. Based on&lt;br /&gt; * the Sieve of Eratosthenes.&lt;br /&gt; */&lt;br /&gt;void gen_primes(bool p[]) {&lt;br /&gt;    p[0] = p[1] = false;&lt;br /&gt;	&lt;br /&gt;    /* &lt;br /&gt;     * starting at number 2 and going to the upper limit, mark &lt;br /&gt;     * all numbers as potential primes &lt;br /&gt;     */  &lt;br /&gt;    for (int i=2; i&lt;MAXPRIME; i++) {&lt;br /&gt;        p[i] = true;&lt;br /&gt;    }&lt;br /&gt;	&lt;br /&gt;    int m = floor(sqrt(MAXPRIME));&lt;br /&gt;    int n;&lt;br /&gt;    /* &lt;br /&gt;     * mark all multiples of a prime as non-primes. this has to be done for primes &lt;br /&gt;     * only up to the square root, since every number in the array has at least &lt;br /&gt;     * one factor smaller than the square root of the limit. &lt;br /&gt;     */&lt;br /&gt;    for (int i=2; i&lt;m; i++) {&lt;br /&gt;        if (p[i]) {&lt;br /&gt;       	    n = MAXPRIME / i;&lt;br /&gt;	    for (int j=2; j&lt;=n; j++) {&lt;br /&gt;	        p[i * j] = false;&lt;br /&gt;	    }&lt;br /&gt;	}&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/* generates all carmichael numbers up to the given limit by performing the fermat test */&lt;br /&gt;void gen_carmi(bool c[], bool p[]) {&lt;br /&gt;&lt;br /&gt;    /* initialize carmichael numbers array with false */&lt;br /&gt;    memset(c, 0, MAXPRIME * sizeof(bool));&lt;br /&gt;	&lt;br /&gt;    /* &lt;br /&gt;     * starting from the first non-prime, mark all &lt;br /&gt;     * odd numbers as potential carmichael numbers &lt;br /&gt;     */&lt;br /&gt;    for (int i=9; i&lt;MAXPRIME; i+=2) {&lt;br /&gt;	c[i] = true;&lt;br /&gt;    }&lt;br /&gt;	&lt;br /&gt;    /* &lt;br /&gt;     * again, for all odd numbers, we exclude the primes and perform&lt;br /&gt;     * the fermat test for 2 &lt;= a &lt;= n-1.&lt;br /&gt;     */&lt;br /&gt;    for (int n=9; n&lt;MAXPRIME; n+=2) {&lt;br /&gt;	/* VERY IMPORTANT! check first if this number is prime, otherwise we get TLE */&lt;br /&gt;	if (p[n]) {&lt;br /&gt;	    c[n] = false;&lt;br /&gt;	    continue;&lt;br /&gt;	}&lt;br /&gt;	for (int a=2; a&lt;=n-1; a++) {&lt;br /&gt;	    if (fast_mod_pow(a,n,n) != a) {&lt;br /&gt;	        c[n] = false;&lt;br /&gt;		break;&lt;br /&gt;	    } &lt;br /&gt;	}	&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/* main */&lt;br /&gt;int main() {&lt;br /&gt;    unsigned long long n; /* number */&lt;br /&gt;    unsigned long long a; /* a of the fermat test */&lt;br /&gt;    bool prime[MAXPRIME]; /* prime numbers array */&lt;br /&gt;    bool carmi[MAXPRIME]; /* carmichael numbers array */&lt;br /&gt;	&lt;br /&gt;    gen_primes(prime);&lt;br /&gt;    gen_carmi(carmi, prime);&lt;br /&gt;	&lt;br /&gt;    while (cin &gt;&gt; n &amp;&amp; (n != 0)) {	&lt;br /&gt;        if (carmi[n]) {&lt;br /&gt;            cout &lt;&lt; "The number " &lt;&lt; n &lt;&lt; " is a Carmichael number." &lt;&lt; endl;&lt;br /&gt;        } else {&lt;br /&gt;            cout &lt;&lt; n &lt;&lt; " is normal." &lt;&lt; endl;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    return 0;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Thu, 24 Apr 2008 23:16:02 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/5429</guid>
      <author>jmftrindade (Joana M. F. da Trindade)</author>
    </item>
  </channel>
</rss>
