UNPKG

aureooms-js-algo

Version:

playground for algorithmic code bricks in JavaScript

80 lines (53 loc) 2.44 kB
/** * Transforms an instance of the one-set version of kLDT with k >= 4 even into * a two-set version of 2SUM. * * @param {set} S is the input set for the kLDT problem * @param {coefficients} a is the array of coefficients * @param {set} A is one of the input set for 2SUM * @param {set} B is one of the input set for 2SUM * * notes: * - n = Sj - Si * - k = aj - ai - 1 * - a_0 = a[ai] * - A and B must be of size n^(k/2) each * - B must be initialized to 0 ... 0 * */ var evenkldtto2sum = function ( S , Si , Sj , a , ai , aj , A , Ai , Aj , B , Bi , Bj ) { var i , j , p , q , n , halfk ; n = Sj - Si ; k = aj - ai - 1 ; halfk = 1 + k / 2 ; // We fill A and B for example with S = [ 1 , 2 , 3 ] and a = [ t , v , w , x , y ] // ----------------------------------------------------------------------- // A <- | t | t | t | t | t | t | t | t | t | // ----------------------------------------------------------------------- for ( p = Ai ; p < Aj ; ++p ) { A[p] = a[ai] ; } // ----------------------------------------------------------------------- // A += | v * 1 | v * 2 | v * 3 | v * 1 | v * 2 | v * 3 | v * 1 | v * 2 | v * 3 | // ----------------------------------------------------------------------- // ----------------------------------------------------------------------- // A += | w * 1 | w * 1 | w * 1 | w * 2 | w * 2 | w * 2 | w * 3 | w * 3 | w * 3 | // ----------------------------------------------------------------------- for ( j = 1 , i = 1 ; j < halfk ; ++j , i *= n ) { for ( p = Ai , q = 0 ; p < Aj ; ++p , q = ( ( q + 1 ) / i | 0 ) % n ) { A[p] += a[ai + j] * S[Si + q] ; } } // ----------------------------------------------------------------------- // B += | x * 1 | x * 2 | x * 3 | x * 1 | x * 2 | x * 3 | x * 1 | x * 2 | x * 3 | // ----------------------------------------------------------------------- // ----------------------------------------------------------------------- // B += | y * 1 | y * 1 | y * 1 | y * 2 | y * 2 | y * 2 | y * 3 | y * 3 | y * 3 | // ----------------------------------------------------------------------- for ( i = 1 ; j <= k ; ++j , i *= n ) { for ( p = Bi , q = 0 ; p < Bj ; ++p , q = ( ( q + 1 ) / i | 0 ) % n ) { B[p] += a[ai + j] * S[Si + q] ; } } } ; exports.evenkldtto2sum = evenkldtto2sum;