############################################################################ # # this is the code of exercise 4.5.3 # ########################################################################### subs := function( ct, basm, vec, irrB, p ) local nullv, x, y, v, cands, psing, preg, rest, relations; cands := []; psing := Filtered( [1..Length(Irr(ct))], i->IsInt( OrdersClassRepresentatives(ct)[i]/p ) ); preg := Difference( [1..Length(Irr(ct))], psing ); nullv := List( [1..Length(psing)], x -> 0 ); rest := Difference( irrB, basm ); relations := List( rest, i -> SolutionMat( Irr(ct){basm}{preg}, Irr(ct)[i]{preg} ) );; for x in Cartesian ( List( vec{List(basm, i -> Position(irrB,i) )} , c -> [0..c] ) ) do v:= [] ; v{List( basm, i -> Position(irrB,i) )} := x; v{List( rest, i -> Position(irrB,i) )} := List([1..Length(rest)], i-> x*relations[i]); y := v * Irr(ct){irrB};; if ForAll( v, c -> c >= 0 ) and y{psing} = nullv and ForAll( [1..Length(v)] , i -> v[i] <= vec[i] ) and Sum(v) > 0 then Add( cands, v ); fi; od; return(cands); end;;