1:  using System;
   2:   
   3:  namespace Divisibilidad {
   4:   
   5:      class Program {
   6:   
   7:          static void Main( string [] args ) {
   8:              string N = "239058";
   9:              Divisibilidad d = new Divisibilidad( 7, 3 );
  10:              Console.WriteLine( d.mod( N ) );
  11:          }
  12:   
  13:      }
  14:   
  15:      class Divisibilidad {
  16:   
  17:          private int _div;
  18:          private int _dig;
  19:          private int [] _delta;
  20:   
  21:          public Divisibilidad( int divisor ) {
  22:              init( divisor, 1 );
  23:          }
  24:          public Divisibilidad( int divisor, int digitos ) {
  25:              init( divisor, digitos );
  26:          }
  27:   
  28:          public int mod( string bigN ) {
  29:              { // dígitos múltiplo de _dig
  30:                  int r = bigN.Length % _dig;
  31:                  if( r != 0 )
  32:                      bigN = ( new String( '0', _dig - r ) ) + bigN;
  33:              }
  34:              int p = 0, q = 0, D = 0, d = 0;
  35:   
  36:              // si en lugar de empaquetar bigN en ASCII se empaqueta en
  37:              // BDC (o equivalente), se pueden sólo es necesario realizar
  38:              // <digitos de bigN> / <_dig> iteraciones. Por simplicidad se
  39:              // "subitera" sobre el grupo.
  40:              foreach( char c in bigN ) {
  41:                  D = ( D << 3 ) + D + D;
  42:                  D += c - '0';
  43:                  if( ++d == _dig ) {
  44:                      p = _delta [ q = p + D ];
  45:                      D = d = 0;
  46:                  }
  47:              }
  48:              return q % _div;
  49:          }
  50:   
  51:          private void init( int d, int g ) {
  52:              _div = d;
  53:              _dig = g;
  54:              int p10 = 1;
  55:              for( int dg = g; dg > 0; dg-- )
  56:                  p10 *= 10;
  57:              _delta = new int [ p10 + d - 1 ];
  58:              for( int i = 0; i < _delta.Length; i++ )
  59:                  _delta [ i ] = ( p10 * ( ( i + d ) % d ) ) % d;
  60:          }
  61:   
  62:      }
  63:   
  64:   
  65:  }