Haskell, 228 227 225225 224 bytes
import Data.List
z=zipWith
a!b=div(max(a*a)(a*b))a
l x=z(!)(z(!)x(0:x))$tail x++[0]
s=(\x->>length.(sum[1|b<-x,b>0],sum[1|b<-x$x).filter<$>[(>0),b<0](<0)]).nub.(>>=id).(until=<<((==)=<<))((.)>>=id$transpose.map l).z(\i->z(\j x->2^i*j*(2*x-1))[1,3..])[1..]
s=(\x->>length.(sum[1|b<-x,b>0],sum[1|b<-x$x).filter<$>[(>0),b<0](<0)]).nub.(>>=id).(until=<<((==)=<<))((.)>>=id$transpose.map l).z(\i->z(\j x->2^i*j*(2*x-1))[1,3..])[1..]
(\x->>length.(sum[1|b<-x,b>0],sum[1|b<-x$x).filter<$>[(>0),b<0](<0)]).nub.(>>=id)
(>>=id)
squashes the list of lists into a single list,
nub
gets rid of doubles,
(\x->>length.(sum[1|b<-x,b>0],sum[1|b<-x$x).filter<$>[(>0),b<0](<0)])
partitions the list into a pair of lists, one for positive and one for negative numbers, and calculates their lengths via replacing all entries with 1
and summing.