Regex (ECMAScript), 112 104 bytes
^(x+),((?=\1*.*?(((x+)(?=\5$))*)x$)(?=.*(?=\1$)(x(x(x*)\8))(?=\6*$)\3\7*$)(?=.*(?=\1*$)(\1\8+$))\9x\3)*$
Takes denominator and numerator (in that order) from input in unary as strings of xs whose length represents the number, separated by a ,.
Try it online! - test cases only
Try it online! - all reducible numerators / denominators up to 256
ECMAScript regex is incapable of matching unbounded palindromes, but it can match binary palindromes that are encoded in unary.
In this regex flavor it is not possible to keep track of more than one changing number in a loop (and that one number can only decrease), so this regex's main loop works by preserving the property of symmetry at each step, if that property exists in the input.
This works by starting from the middle and going outward. On each step, it finds the largest \$1\$ bit in the right half (i.e. less than the denominator) and subtracts it from \$tail\$, along with the power of \$2\$ corresponding to the mirrored bit in the left half. (It doesn't need to actually check if that left-side bit is \$1\$, because if it isn't, the calculation of that bit's value will either fail due to not fitting in \$tail\$, or \$1\$ will be subtracted from a \$0\$ bit, resulting in borrow, but making it impossible to end with \$tail=0\$.) Then iff at the end \$tail=0\$, the input fraction was symmetric.
It does not work by going from the outside in, finding the largest remaining \$1\$ bit in the left half and subtracting it from both halves, because although this would slightly streamline the matching of each left-side bit, the full regex would be much longer. The mirroring of each bit would take two divisions (instead of one division and one multiplication), and detection of each right-side bit being \$1\$ would need to be done explicitly (with modulo and comparison).
It uses the first shortened form of division, which is possible thanks to the divisor always being a prime power. (Grimmy's further shortening trick isn't applicable because capturing \$divisor-1\$ costs nothing in this case.)
^ # tail = denominator (x+) # \1 = tail (assumed to be a power of 2 ≥ 2) , # tail = numerator ( # Begin main loop (?= \1* # tail = tail % \1 .*? (((x+)(?=\5$))*) # \3 = {largest power of 2 ≤ tail} - 1 x$ ) (?= .*(?=\1$) # tail = \1 # Do the division: \6 = tail / (\3 + 1), assuming dividend > 0 (x(x(x*)\8)) # \6 = conjectured quotient - find the largest one that # matches the following assertions; \7 = \6-1; # \8 = (\7 - 1) / 2 = \6 / 2 - 1; tail -= \6 (?=\6*$) # Assert tail is divisible by quotient # The test for divisibility by \3 can be omitted because # the divisor is a prime power. \3\7*$ # Assert tail-(divisor-1) is divisible by quotient-1 ) (?= .*(?=\1*$) # tail = \1 * (\8 + 1), where \1 > \8+1 (\1\8+$) # \9 = tail, the result of the multiplication ) \9 # tail -= \9 x\3 # tail -= \3 + 1 )* # Iterate the above as many times as possible, which can # be as low as zero. $ # Assert tail == 0
0/2a valid input? \$\endgroup\$0/1. \$\endgroup\$57/8(falsy). As currently, simply testing if numerator can be divided by 3 passes all testcases. \$\endgroup\$