67 ; 31 : test(sv);
68
69 inc DWORD PTR i
####
C:\test>DeBruijnX -N=8 -ALPHA=0123456789
Took: 1586.944328 secs
100000000
Took: 0.579065 secs
100000000
##
##
#! perl -slw
use strict; # use Config; print $Config{ ccflags };
use Inline C => Config => BUILD_NOISY => 1; #, CCFLAGS => $Config{ ccflags } . "/link /FAs";
use Inline C => <<'END_C', NAME => '_deBruijn', CLEAN_AFTER_BUILD =>0;
#define PERL_NO_GET_CONTEXT 1
int n, iseq;
STRLEN k;
char *seq, *a;
void dbc( int t, int p ) {
int i;
if( t > n ) {
if( n % p == 0 )
for( i = 1; i <= p; ++i )
seq[ iseq++ ] = a[ i ];
}
else {
a[ t ] = a[ t - p ];
dbc( t+1, p );
for( i = a[ (t - p) ] + 1; i < k; ++i ) {
a[ t ] = i;
dbc( t+1, t );
}
}
}
SV *deBruijnC( SV *svAlphabet, SV *len ) {
int i;
char *alphabet = SvPV( svAlphabet, k );
n = (int)SvIV( len );
iseq = 0;
Newxz( seq, (int)pow( (double)k, (double)n), char );
Newxz( a, k * n, char );
dbc( 1, 1 );
for( i = 0; i < iseq ; ++i ) {
seq[ i ] = alphabet[ seq[ i ] ];
}
return newSVpv( seq, iseq );
}
END_C