Bugtraq mailing list archives

NP-complete solution given is exponential


From: aleph1 () DFW NET (Aleph One)
Date: Thu, 2 Oct 1997 17:16:15 -0500


---------- Forwarded message ----------
Date: 19 Sep 1997 13:07:48 -0600
From: Chris Hall <hallc () dimensional com>
Newsgroups: sci.crypt, sci.math
Subject: NP-complete solution given is exponential

Claim: There is no known polynomial-time algorithm for solving an
    NP-complete problem.

Proof: Before today (19 Sep 1997) none were known of in the open community.
    One person posted a claimed solution, but I will demonstrate that this
    program still runs in exponential time.

    I have written a simple program which demonstrates that John's program
    takes exponential time.  It produces expressions of the form

    !(!(!....(!a^!b)^c)^!d)^e)^!f)....

    Notice the pattern of variables 3+, it alternates between negating the
    variable and not.  The basic principle is that each level of nesting
    should match on roughly half the set of possible assignments and the
    negation that appears at the left forces the program to negate such a
    set.  That is, I tried to get the program to negate exponentially sized
    sets (and succeeded).

    Here is the source code:

------------------------------

#include <stdio.h>

int
main(int argc, char **argv)
{
    short   i, num_args;

    if (argc != 2) {
        fprintf(stderr, "invalid arguments.\n");
        return -1;
    }

    num_args = atoi(argv[1]);
    if (num_args < 2) {
        fprintf(stderr, "invalid num_args\n");
        return -1;
    }

    printf("(");
    for (i = 0; i < num_args-2; i++)
        printf("!(");
    printf("!0^!1)");
    for (i = 2; i < num_args; i++) {
        printf("^");
        if (i % 2 == 1)
            printf("!");
        printf("%d)", i);
    }
    printf("\n");

    return 0;
}

------------------------------

    The following is a table demonstrating the results of running John's
    program against the input produced by mine.  The first column gives the
    number of variables in the resulting expression, the second column
    gives the length of the expression in characters, and the third column
    gives the amount of user-space time as reported by the time command
    (I'm running Linux).

     i | len |  time
    ---+-----+--------
     8 |  41 |  0.030u
     9 |  46 |  0.030u
    10 |  52 |  0.020u
    11 |  58 |  0.050u
    12 |  65 |  0.070u
    13 |  71 |  0.120u = 1.7  * previous
    14 |  78 |  0.160u = 1.3  * previous
    15 |  84 |  0.290u = 1.8  * previous
    16 |  91 |  0.460u = 1.6  * previous
    17 |  97 |  0.780u = 1.7  * previous
    18 | 104 |  1.300u = 1.67 * previous
    19 | 110 |  2.020u = 1.55 * previous
    20 | 117 |  3.470u = 1.72 * previous
    21 | 123 |  5.410u = 1.56 * previous
    22 | 130 |  8.960u = 1.66 * previous
    23 | 136 | 14.100u = 1.57 * previous
    24 | 143 | 23.030u = 1.63 * previous

    Note how the time increases exponentially (the average of the last
    seven deltas is 1.62) in the number of variables (lower exponent in
    the size of the input, but still exponential).

    Anyone is free to use my code to verify my claim, but I'm fairly
    certain about the results: there is no known polynomial-time algorithm
    for solving an NP-complete problem.  Q.E.D.

                                                                Cheers,
                                                                Chris Hall

P.S. Please reply to hall () counterpane com as that is my normal e-mail
     at Counterpane Systems (work, and where I prefer to receive e-mail).



Current thread: