The other answer mentions magma. I can, at least, provide a program that shows the genus and spinor genera given one form in the genus. The web page to paste the program is http://magma.maths.usyd.edu.au/calc I should add that the full length program, for use with magma itself, not an online calculator website, had significant preprocessing in C++ as well as postprocessing. Maybe the most important thing missing is the reduction of forms according to the reduction scheme of Alexander Schiemann. As a result, you should have some method for deciding whether two (positive) forms are equivalent. This is a finite check, not difficult, but needs to be done. For example, the output (far below) gives $\langle 1,4,9,-4,0,0 \rangle$ insted of $\langle 1,4,9,4,0,0 \rangle.$ Also, magma prints some peculiar things when the power of $2$ dividing the discriminant is large. When you ask for the genus of the regular form $\langle 1,8,64,0,0,0 \rangle,$ it correctly says there are two spinor genera but types the same form in both, an obvious error. This error first came to light when Manjul Bhargava asked Kaplansky about genera of a single class. So, things should be checked with, for example, the mass formula. One simple check is that spinor genera of the same genus must have the same mass. Here is my program: Q:=RationalField(); Z:=Integers(); M3:=MatrixRing(IntegerRing(),3); tolettuce:=function(sixlist) temp := LatticeWithGram(M3![2 * sixlist[1],sixlist[6],sixlist[5], sixlist[6], 2 * sixlist[2],sixlist[4], sixlist[5],sixlist[4],2 * sixlist[3]]); return temp ; end function; tohex := function(lettuce) tripe := Basis(lettuce); return [ Norm( tripe[1] ) div 2 , Norm( tripe[2] ) div 2 , Norm( tripe[3] ) div 2 , InnerProduct( tripe[2],tripe[3] ) , InnerProduct( tripe[3],tripe[1] ) , InnerProduct( tripe[1],tripe[2] ) ] ; end function; temp2 := tolettuce([1, 1, 32 , 0,0,0]); // CHANGE !!!!!!!!!! tempgenus := GenusRepresentatives(temp2); tempSG := SpinorGenera(Genus(temp2)); print "=====Discriminant " , " ==Genus Size== ", #tempgenus , "\n"; // print "This genus has " , #tempSG , " spinor genera ------\n"; reps := [ Representatives(S) : S in tempSG]; for i in [1..#reps] do tempspin := reps[i]; // print "-------------**---------------------- ", " s. g. size--- ", #tempspin , "\n"; for j in [1..#tempspin] do tohex(tempspin[j]); end for; print "\n---**----- end of spinor genus ", i, " --------\n"; // print "--------------------------------------------------"; end for; Here it is in use [![enter image description here][1]][1] [![enter image description here][2]][2] [![enter image description here][3]][3] ================================================== The expectation of effective elementary methods is a bit optimistic. First, I put many relevant papers at [TERNARY][4]. Next, a genus with more than one spinor genus need not have any spinor exceptional integers. This example, two regular forms, does have splitting integers, meaning numbers for which the Siegel weighted average of representations for one spinor genus differs from that for the other spinor genus (when exactly two spinor genera). =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= ===Discriminant 27 ==Genus Size== 2 27 = 3^3 Smallest Splitting Integer 1 = 1 No Spinor Exceptions 1 8 1 = 1 4 -16 4 = 2^2 16 32 16 = 2^4 25 -40 25 = 5^2 49 56 49 = 7^2 Spinor genus misses no exceptions 27: 1 1 9 0 0 1 auto 24 Level 36 regular candidate --------------------------size 1 Spinor genus misses no exceptions 27: 1 3 3 3 0 0 auto 24 Level 36 regular candidate --------------------------size 1 Disc 27 spinor genus count 2 =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= It is also possible for a genus to have no spinor exceptional integers and no splitting integers. The smallest discriminant for this (in the discriminant I use) is 1375. ================================== THESE GENERA HAVE NO SPLITTING INTEGERS !! =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= ===Discriminant 1375 ==Genus Size== 8 1375 = 5^3 * 11 Spinor genus misses no exceptions 1375: 1 5 70 5 0 0 auto 8 Level 1100 1375: 1 14 25 0 0 1 auto 8 Level 1100 1375: 4 5 19 5 3 0 auto 4 Level 1100 1375: 5 9 9 7 0 0 auto 8 Level 1100 --------------------------size 4 Spinor genus misses no exceptions 1375: 1 5 69 0 1 0 auto 8 Level 1100 1375: 1 20 20 15 0 0 auto 8 Level 1100 1375: 4 4 25 0 0 3 auto 8 Level 1100 1375: 5 9 9 2 0 5 auto 4 Level 1100 --------------------------size 4 Disc 1375 spinor genus count 2 =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= Thought I recognized this. [It appears in Benham, Earnest, Hsia, and Hung (1990), Theorem 1, item (3.4).][5] Page 6. =====Discriminant ==Genus Size== 3 [ 1, 1, 32, 0, 0, 0 ] [ 2, 2, 9, 2, -2, 0 ] ---**----- end of spinor genus 1 -------- [ 1, 4, 9, -4, 0, 0 ] ---**----- end of spinor genus 2 -------- The loner is one of the very few spinor regular forms that are not regular. The following constitutes a proof that $\langle 1,4,9,4,0,0 \rangle$ does not lie in the same spinor genus as $\langle 1,1,32,0,0,0 \rangle:$ we have $$ x^2 + 4 y^2 + 9 z^2 + 4yz \neq 2 m^2, $$ where all prime factors $p$ of $m$ satisfy $p \equiv 1 \pmod 4.$ There are often elementary proofs of spinor exceptional integers, once they have been noticed. In this case, $$ x^2 + (2y+z)^2 \neq 2 (m-2z)(m+2z), $$ where a crucial detail is that $z$ is odd. This is a proof because of the [Corollary to Theorem 3 of Duke and Schulze-Pillot][6] as it is not hard to prove that the first form primitively represents all such $2m^2.$ [1]: https://i.sstatic.net/Y8yQK.jpg [2]: https://i.sstatic.net/QjklW.jpg [3]: https://i.sstatic.net/LqgTU.jpg [4]: http://zakuski.math.utsa.edu/~kap/ [5]: http://zakuski.math.utsa.edu/~kap/Benham_Earnest_Hsia_Hung_1990.pdf [6]: http://zakuski.math.utsa.edu/~kap/Duke_Schulze_Pillot_1990.pdf