377{
378
379 word pCof0[16], pCof1[16];
380 int Pla2Var[10], Var2Pla[10], Count[210], Masks[210];
381 int i, i0,i1,i2,i3, v, x;
382 assert( nVars >= 6 && nVars <= 10 );
383
384 for ( i = 0; i < nVars; i++ )
385 {
386 assert( If_Dec10HasVar( pF, nVars, i ) );
387 Pla2Var[i] = Var2Pla[i] = i;
388 }
389
390
391
392
393
394
395
396
397
398
399
400
401
402 v = 0;
403 for ( i0 = 0; i0 < nVars; i0++ )
404 for ( i1 = i0+1; i1 < nVars; i1++ )
405 for ( i2 = i1+1; i2 < nVars; i2++ )
406 for ( i3 = i2+1; i3 < nVars; i3++, v++ )
407 {
408 If_Dec10MoveTo( pF, nVars, i0, nVars-1, Pla2Var, Var2Pla );
409 If_Dec10MoveTo( pF, nVars, i1, nVars-2, Pla2Var, Var2Pla );
410 If_Dec10MoveTo( pF, nVars, i2, nVars-3, Pla2Var, Var2Pla );
411 If_Dec10MoveTo( pF, nVars, i3, nVars-4, Pla2Var, Var2Pla );
412 If_DecVerifyPerm( Pla2Var, Var2Pla, nVars );
413 Count[v] = If_Dec10CofCount( pF, nVars );
414 Masks[v] = (1 << i0) | (1 << i1) | (1 << i2) | (1 << i3);
416
417 if ( Count[v] == 2 || Count[v] > 5 )
418 continue;
419 for ( x = 0; x < 4; x++ )
420 {
422 if ( If_Dec10CofCount2(pCof0, nVars) <= 2 && If_Dec10CofCount2(pCof1, nVars) <= 2 )
423 {
424 Count[v] = -Count[v];
425 break;
426 }
427 }
428 }
429
431
432 for ( i0 = 0; i0 < v; i0++ )
433 for ( i1 = i0+1; i1 < v; i1++ )
434 {
435 if ( If_Dec10Count16(Masks[i0] & Masks[i1]) > 10 - nVars )
436 continue;
437 if ( nVars == 10 )
438 {
439 if ( Count[i0] == 2 && Count[i1] == 2 )
440 return 1;
441 }
442 else if ( nVars == 9 )
443 {
444 if ( (Count[i0] == 2 && Count[i1] == 2) ||
445 (Count[i0] == 2 && Count[i1] < 0) ||
446 (Count[i0] < 0 && Count[i1] == 2) )
447 return 1;
448 }
449 else
450 {
451 if ( (Count[i0] == 2 && Count[i1] == 2) ||
452 (Count[i0] == 2 && Count[i1] < 0) ||
453 (Count[i0] < 0 && Count[i1] == 2) ||
454 (Count[i0] < 0 && Count[i1] < 0) )
455 return 1;
456 }
457 }
458
459 return 0;
460}
void If_Dec10Cofactors(word *pF, int nVars, int iVar, word *pCof0, word *pCof1)